aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bootstrap/lib/kernel/ebin/inet.beambin24048 -> 24156 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/local_tcp.beambin2396 -> 2396 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/epp.beambin28828 -> 29276 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_pp.beambin26920 -> 26856 bytes
-rw-r--r--erts/doc/src/erl_dist_protocol.xml20
-rw-r--r--erts/doc/src/notes.xml736
-rw-r--r--erts/emulator/sys/unix/sys_drivers.c2
-rw-r--r--erts/preloaded/ebin/erl_prim_loader.beambin55732 -> 55752 bytes
-rw-r--r--erts/preloaded/ebin/erl_tracer.beambin2200 -> 2200 bytes
-rw-r--r--erts/preloaded/ebin/erlang.beambin104648 -> 104816 bytes
-rw-r--r--erts/preloaded/ebin/erts_code_purger.beambin8696 -> 8696 bytes
-rw-r--r--erts/preloaded/ebin/erts_internal.beambin10536 -> 10536 bytes
-rw-r--r--erts/preloaded/ebin/init.beambin50052 -> 50048 bytes
-rw-r--r--erts/preloaded/ebin/otp_ring0.beambin1444 -> 1444 bytes
-rw-r--r--erts/preloaded/ebin/prim_eval.beambin1312 -> 1312 bytes
-rw-r--r--erts/preloaded/ebin/prim_file.beambin44764 -> 44764 bytes
-rw-r--r--erts/preloaded/ebin/prim_inet.beambin76348 -> 76236 bytes
-rw-r--r--erts/preloaded/ebin/prim_zip.beambin23152 -> 23152 bytes
-rw-r--r--erts/preloaded/ebin/zlib.beambin14136 -> 14136 bytes
-rw-r--r--lib/asn1/doc/src/notes.xml15
-rw-r--r--lib/asn1/vsn.mk2
-rw-r--r--lib/common_test/doc/src/notes.xml25
-rw-r--r--lib/common_test/test/ct_netconfc_SUITE.erl2
-rw-r--r--lib/common_test/vsn.mk2
-rw-r--r--lib/compiler/doc/src/notes.xml94
-rw-r--r--lib/compiler/src/compile.erl12
-rw-r--r--lib/compiler/vsn.mk2
-rw-r--r--lib/cosEvent/doc/src/notes.xml17
-rw-r--r--lib/cosEvent/vsn.mk2
-rw-r--r--lib/cosEventDomain/doc/src/notes.xml17
-rw-r--r--lib/cosEventDomain/vsn.mk2
-rw-r--r--lib/cosFileTransfer/doc/src/notes.xml17
-rw-r--r--lib/cosFileTransfer/vsn.mk2
-rw-r--r--lib/cosNotification/doc/src/notes.xml17
-rw-r--r--lib/cosNotification/vsn.mk2
-rw-r--r--lib/cosProperty/doc/src/notes.xml17
-rw-r--r--lib/cosProperty/vsn.mk2
-rw-r--r--lib/cosTime/doc/src/notes.xml17
-rw-r--r--lib/cosTime/vsn.mk2
-rw-r--r--lib/cosTransactions/doc/src/notes.xml17
-rw-r--r--lib/cosTransactions/vsn.mk2
-rw-r--r--lib/crypto/doc/src/notes.xml46
-rw-r--r--lib/crypto/vsn.mk2
-rw-r--r--lib/debugger/doc/src/notes.xml16
-rw-r--r--lib/debugger/vsn.mk2
-rw-r--r--lib/dialyzer/doc/src/notes.xml82
-rw-r--r--lib/diameter/doc/src/notes.xml35
-rw-r--r--lib/edoc/doc/src/notes.xml14
-rw-r--r--lib/edoc/vsn.mk2
-rw-r--r--lib/eldap/doc/src/notes.xml33
-rw-r--r--lib/erl_docgen/doc/src/notes.xml47
-rw-r--r--lib/erl_docgen/vsn.mk2
-rw-r--r--lib/erl_interface/doc/src/notes.xml42
-rw-r--r--lib/erl_interface/vsn.mk2
-rw-r--r--lib/et/doc/src/notes.xml16
-rw-r--r--lib/et/vsn.mk2
-rw-r--r--lib/eunit/doc/src/notes.xml15
-rw-r--r--lib/eunit/vsn.mk2
-rw-r--r--lib/gs/doc/src/notes.xml17
-rw-r--r--lib/gs/vsn.mk2
-rw-r--r--lib/hipe/doc/src/notes.xml40
-rw-r--r--lib/hipe/vsn.mk2
-rw-r--r--lib/ic/doc/src/notes.xml17
-rw-r--r--lib/ic/vsn.mk2
-rw-r--r--lib/inets/doc/src/notes.xml54
-rw-r--r--lib/jinterface/doc/src/notes.xml32
-rw-r--r--lib/jinterface/vsn.mk2
-rw-r--r--lib/kernel/doc/src/notes.xml197
-rw-r--r--lib/kernel/test/gen_tcp_api_SUITE.erl18
-rw-r--r--lib/kernel/test/gen_udp_SUITE.erl18
-rw-r--r--lib/kernel/test/init_SUITE.erl2
-rw-r--r--lib/megaco/doc/src/notes.xml17
-rw-r--r--lib/megaco/vsn.mk2
-rw-r--r--lib/mnesia/doc/src/notes.xml23
-rw-r--r--lib/mnesia/vsn.mk2
-rw-r--r--lib/observer/doc/src/notes.xml45
-rw-r--r--lib/observer/vsn.mk2
-rw-r--r--lib/odbc/doc/src/notes.xml18
-rw-r--r--lib/odbc/vsn.mk2
-rw-r--r--lib/orber/doc/src/notes.xml17
-rw-r--r--lib/orber/vsn.mk2
-rw-r--r--lib/os_mon/doc/src/notes.xml34
-rw-r--r--lib/os_mon/vsn.mk2
-rw-r--r--lib/otp_mibs/doc/src/notes.xml15
-rw-r--r--lib/otp_mibs/vsn.mk2
-rw-r--r--lib/parsetools/doc/src/notes.xml15
-rw-r--r--lib/parsetools/vsn.mk2
-rw-r--r--lib/percept/doc/src/notes.xml29
-rw-r--r--lib/percept/vsn.mk2
-rw-r--r--lib/public_key/doc/src/notes.xml28
-rw-r--r--lib/public_key/vsn.mk2
-rw-r--r--lib/reltool/doc/src/notes.xml19
-rw-r--r--lib/reltool/vsn.mk2
-rw-r--r--lib/runtime_tools/doc/src/notes.xml94
-rw-r--r--lib/runtime_tools/vsn.mk2
-rw-r--r--lib/sasl/doc/src/notes.xml17
-rw-r--r--lib/sasl/test/release_handler_SUITE.erl46
-rw-r--r--lib/snmp/doc/src/notes.xml17
-rw-r--r--lib/snmp/vsn.mk2
-rw-r--r--lib/ssh/doc/src/notes.xml94
-rw-r--r--lib/ssh/src/ssh_auth.erl231
-rw-r--r--lib/ssh/src/ssh_connection_handler.erl30
-rw-r--r--lib/ssh/src/ssh_io.erl52
-rw-r--r--lib/ssh/test/ssh_basic_SUITE.erl84
-rw-r--r--lib/ssl/doc/src/notes.xml154
-rw-r--r--lib/ssl/doc/src/ssl_app.xml8
-rw-r--r--lib/ssl/test/ssl_dist_SUITE.erl342
-rw-r--r--lib/stdlib/doc/src/notes.xml314
-rw-r--r--lib/syntax_tools/doc/src/notes.xml26
-rw-r--r--lib/tools/doc/src/notes.xml35
-rw-r--r--lib/tools/vsn.mk2
-rw-r--r--lib/typer/doc/src/notes.xml15
-rw-r--r--lib/typer/vsn.mk2
-rw-r--r--lib/wx/doc/src/notes.xml37
-rw-r--r--lib/wx/vsn.mk2
-rw-r--r--lib/xmerl/doc/src/notes.xml15
-rw-r--r--lib/xmerl/vsn.mk2
-rw-r--r--otp_versions.table2
-rw-r--r--system/doc/top/templates/index.html.src22
119 files changed, 3323 insertions, 414 deletions
diff --git a/bootstrap/lib/kernel/ebin/inet.beam b/bootstrap/lib/kernel/ebin/inet.beam
index b771df5608..5ae4090a61 100644
--- a/bootstrap/lib/kernel/ebin/inet.beam
+++ b/bootstrap/lib/kernel/ebin/inet.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/local_tcp.beam b/bootstrap/lib/kernel/ebin/local_tcp.beam
index 9ff39fd7fa..3c1de4fab9 100644
--- a/bootstrap/lib/kernel/ebin/local_tcp.beam
+++ b/bootstrap/lib/kernel/ebin/local_tcp.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/epp.beam b/bootstrap/lib/stdlib/ebin/epp.beam
index 54909eeaa3..5bcc7cf8d9 100644
--- a/bootstrap/lib/stdlib/ebin/epp.beam
+++ b/bootstrap/lib/stdlib/ebin/epp.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_pp.beam b/bootstrap/lib/stdlib/ebin/erl_pp.beam
index 012c28ac81..e845392e4b 100644
--- a/bootstrap/lib/stdlib/ebin/erl_pp.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_pp.beam
Binary files differ
diff --git a/erts/doc/src/erl_dist_protocol.xml b/erts/doc/src/erl_dist_protocol.xml
index f9fa981d9a..25f601a235 100644
--- a/erts/doc/src/erl_dist_protocol.xml
+++ b/erts/doc/src/erl_dist_protocol.xml
@@ -930,11 +930,14 @@ DiB == gen_digest(ChA,ICA) ?
<tag><c>SEND</c></tag>
<item>
<p>
- <c>{2, Cookie, ToPid}</c>
+ <c>{2, Unused, ToPid}</c>
</p>
<p>
<em>Note</em> followed by <c>Message</c>
</p>
+ <p>
+ <c>Unused</c> is kept for backward compatibility
+ </p>
</item>
<tag><c>EXIT</c></tag>
@@ -961,11 +964,14 @@ DiB == gen_digest(ChA,ICA) ?
<tag><c>REG_SEND</c></tag>
<item>
<p>
- <c>{6, FromPid, Cookie, ToName}</c>
+ <c>{6, FromPid, Unused, ToName}</c>
</p>
<p>
<em>Note</em> followed by <c>Message</c>
</p>
+ <p>
+ <c>Unused</c> is kept for backward compatibility
+ </p>
</item>
<tag><c>GROUP_LEADER</c></tag>
@@ -991,11 +997,14 @@ DiB == gen_digest(ChA,ICA) ?
<tag><c>SEND_TT</c></tag>
<item>
<p>
- <c>{12, Cookie, ToPid, TraceToken}</c>
+ <c>{12, Unused, ToPid, TraceToken}</c>
</p>
<p>
<em>Note</em> followed by <c>Message</c>
</p>
+ <p>
+ <c>Unused</c> is kept for backward compatibility
+ </p>
</item>
<tag><c>EXIT_TT</c></tag>
@@ -1008,11 +1017,14 @@ DiB == gen_digest(ChA,ICA) ?
<tag><c>REG_SEND_TT</c></tag>
<item>
<p>
- <c>{16, FromPid, Cookie, ToName, TraceToken}</c>
+ <c>{16, FromPid, Unused, ToName, TraceToken}</c>
</p>
<p>
<em>Note</em> followed by <c>Message</c>
</p>
+ <p>
+ <c>Unused</c> is kept for backward compatibility
+ </p>
</item>
<tag><c>EXIT2_TT</c></tag>
diff --git a/erts/doc/src/notes.xml b/erts/doc/src/notes.xml
index 7501ccd9ce..3c3129d543 100644
--- a/erts/doc/src/notes.xml
+++ b/erts/doc/src/notes.xml
@@ -32,6 +32,742 @@
<p>This document describes the changes made to the ERTS application.</p>
+<section><title>Erts 8.0</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>The handling of <c>on_load</c> functions has been
+ improved. The major improvement is that if a code upgrade
+ fails because the <c>on_load</c> function fails, the
+ previous version of the module will now be retained.</p>
+ <p>
+ Own Id: OTP-12593</p>
+ </item>
+ <item>
+ <p><c>is_builtin(erlang, apply, 3)</c> will now return
+ <c>true</c>.</p>
+ <p>
+ Own Id: OTP-13034</p>
+ </item>
+ <item>
+ <p>
+ Fix <c>enif_get_list_length</c> to return false if list
+ is improper or have length larger than <c>UINT_MAX</c>
+ (did return true and an incorrect length value).</p>
+ <p>
+ Own Id: OTP-13288 Aux Id: PR913 </p>
+ </item>
+ <item>
+ <p>
+ Cleanup hipe signal handling code for x86 and make it
+ more portable.</p>
+ <p>
+ Own Id: OTP-13341 Aux Id: PR951 </p>
+ </item>
+ <item>
+ <p>
+ Make file:datasync use fsync instead of fdatasync on Mac
+ OSX.</p>
+ <p>
+ Own Id: OTP-13411</p>
+ </item>
+ <item>
+ <p>
+ Make sure to create a crash dump when running out of
+ memory. This was accidentally removed in the erts-7.3
+ release.</p>
+ <p>
+ Own Id: OTP-13419</p>
+ </item>
+ <item>
+ <p>
+ A bug has been fixed where if erlang was started +B on a
+ unix platform it would be killed by a SIGUSR2 signal when
+ creating a crash dump.</p>
+ <p>
+ Own Id: OTP-13425</p>
+ </item>
+ <item>
+ <p>
+ Fix race between <c>process_flag(trap_exit,true)</c> and
+ a received exit signal.</p>
+ <p>
+ A process could terminate due to exit signal even though
+ <c>process_flag(trap_exit,true)</c> had returned. A very
+ specific timing between call to <c>process_flag/2</c> and
+ exit signal from another scheduler was required for this
+ to happen.</p>
+ <p>
+ Own Id: OTP-13452</p>
+ </item>
+ <item>
+ <p>Don't search for non-existing Map keys twice</p>
+ <p>For <c>maps:get/2,3</c> and <c>maps:find/2</c>,
+ searching for an immediate key, e.g. an atom, in a small
+ map, the search was performed twice if the key did not
+ exist.</p>
+ <p>
+ Own Id: OTP-13459</p>
+ </item>
+ <item>
+ <p>
+ When an abnormally large distribution message is about to
+ be sent, the VM has been changed to create a crash dump
+ instead of a core dump.</p>
+ <p>
+ Own Id: OTP-13474</p>
+ </item>
+ <item>
+ <p>
+ Fix <c>erlang:process_info/2</c> type specification</p>
+ <p>
+ Own Id: OTP-13485 Aux Id: ERL-123 </p>
+ </item>
+ <item>
+ <p>
+ Fix bug in <c>open_port/2</c> with option <c>{args,
+ List}</c>. A vm crash could be caused by an improper
+ <c>List</c>.</p>
+ <p>
+ Own Id: OTP-13489 Aux Id: ERL-127 </p>
+ </item>
+ <item>
+ <p>
+ Fixed a race-condition bug where the emulator could crash
+ when <c>erlang:system_profile/1,2</c> was enabled and a
+ process had to be re-scheduled during termination.</p>
+ <p>
+ Own Id: OTP-13494 Aux Id: ERL-126 </p>
+ </item>
+ <item>
+ <p>
+ Fixed bugs where the reduction counter was not handled
+ correct.</p>
+ <p>
+ Own Id: OTP-13512</p>
+ </item>
+ <item>
+ <p>
+ Fixed typo in description of the <c>EPMD_DUMP_REQ</c>
+ response.</p>
+ <p>
+ Own Id: OTP-13517</p>
+ </item>
+ <item>
+ <p>
+ Fixed a bug where a process flagged as sensitive would
+ sometimes record its save_calls when it shouldn't.</p>
+ <p>
+ Own Id: OTP-13540</p>
+ </item>
+ <item>
+ <p>
+ Update configure scripts to not use hard-coded path for
+ /bin/pwd and /bin/rm.</p>
+ <p>
+ Own Id: OTP-13562</p>
+ </item>
+ <item>
+ <p>
+ When passing a larger binary than the outputv callback of
+ a linked-in driver can handle in one io vector slot, the
+ binary is now split into multiple slots in the io vector.
+ This change only effects system where the max size of an
+ io vector slot is smaller then the word size of the
+ system (e.g. Windows).</p>
+ <p>
+ This change means that it is now possible on Windows to
+ send binaries that are larger than 4GB to port_command,
+ which is what is used for file:write, gen_tcp:send etc.</p>
+ <p>
+ Own Id: OTP-13628</p>
+ </item>
+ <item>
+ <p>
+ Workaround of Maps output in crashdumps. Currently the
+ atom 'undefined' is generated instead of Map data if a
+ Map type is encountered during crash.</p>
+ <p>
+ Own Id: OTP-13657</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ The tracing support has been extended to allow a <seealso
+ marker="erl_tracer">tracer module</seealso> to be the
+ trace event handler instead of a process or port. The
+ <seealso marker="erl_tracer">tracer module</seealso>
+ makes it possible for trace tools to filter or manipulate
+ trace event data without the trace event first having to
+ be copied from the traced process or port.</p>
+ <p>
+ With the introduction of this feature,
+ <c>erlang:trace(all|existing, _, _)</c> now also returns
+ the tracer process as part of the number of processes on
+ which tracing is enabled. The is incompatible with the
+ previous releases.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-10267</p>
+ </item>
+ <item>
+ <p>
+ Introduce LTTng tracing of Erlang Runtime System</p>
+ <p>
+ For LTTng to be enabled OTP needs to be built with
+ configure option <c>--with-dynamic-trace=lttng</c>.</p>
+ <p>
+ This feature introduces tracepoints for schedulers,
+ drivers, memory carriers, memory and async thread pool.</p>
+ <p> For a list of all tracepoints, see <seealso
+ marker="runtime_tools:LTTng">Runtime Tools User's
+ Guide</seealso> .</p>
+ <p>
+ Own Id: OTP-10282</p>
+ </item>
+ <item>
+ <p>
+ Make it possible to monitor/demonitor ports using the
+ <seealso
+ marker="erlang#monitor/2">erlang:monitor/2</seealso> API.
+ The process and port information functions have also been
+ updated to include information about monitors from
+ processes to ports.</p>
+ <p>
+ Own Id: OTP-11384</p>
+ </item>
+ <item>
+ <p>
+ Add microstate accounting</p>
+ <p>
+ Microstate accounting is a way to track which state the
+ different threads within ERTS are in. The main usage area
+ is to pin point performance bottlenecks by checking which
+ states the threads are in and then from there figuring
+ out why and where to optimize.</p>
+ <p>
+ Since checking whether microstate accounting is on or off
+ is relatively expensive only a few of the states are
+ enabled by default and more states can be enabled through
+ configure.</p>
+ <p>
+ There is a convenience module called msacc that has been
+ added to runtime_tools that can assist in gathering and
+ interpreting the data from Microstate accounting.</p>
+ <p>
+ For more information see <seealso
+ marker="erts:erlang#statistics_microstate_accounting">erlang:statistics(microstate_accounting,
+ _)</seealso> and the <seealso
+ marker="runtime_tools:msacc">msacc</seealso> module in
+ runtime_tools.</p>
+ <p>
+ Own Id: OTP-12345</p>
+ </item>
+ <item>
+ <p>
+ The port of Erlang/OTP to the real-time operating system
+ OSE has been removed.</p>
+ <p>
+ Own Id: OTP-12573</p>
+ </item>
+ <item>
+ <p>
+ Sharing preserved copy for messages and exit signals</p>
+ <p>
+ Enable sharing preserved copy with configure option
+ <c>--enable-sharing-preserving</c>. This will preserve
+ sharing, within the process, when communication with
+ other processes in the Erlang node. There is a trade-off,
+ the copy is more costly but this cost can be reclaimed if
+ there is a lot of sharing in the message. In addition
+ literals will not be copied in a send except during a
+ purge phase of the module where the literals are located.
+ This feature is considered experimental in 19.0.</p>
+ <p>
+ Own Id: OTP-12590 Aux Id: OTP-10251 </p>
+ </item>
+ <item>
+ <p>
+ Halfword BEAM has been removed.</p>
+ <p>
+ Own Id: OTP-12883</p>
+ </item>
+ <item>
+ <p>
+ Added <seealso
+ marker="kernel:os#perf_counter/1">os:perf_counter/1</seealso>.</p>
+ <p>
+ The perf_counter is a very very cheap and high resolution
+ timer that can be used to timestamp system events. It
+ does not have monoticity guarantees, but should on most
+ OS's expose a monotonous time.</p>
+ <p>
+ Own Id: OTP-12908</p>
+ </item>
+ <item>
+ <p>
+ Support for a fragmented young heap generation. That is,
+ the young heap generation can consist of multiple non
+ continuous memory areas. The main reason for this change
+ is to avoid extra copying of messages that could not be
+ allocated directly on the receivers heap.</p>
+ <p>
+ Own Id: OTP-13047</p>
+ </item>
+ <item>
+ <p>
+ Erlang linked-in driver can now force the call to
+ open_port to block until a call to erl_drv_init_ack is
+ made inside the driver. This is useful when you want to
+ do some asynchronous initialization, for example getting
+ configuration from a pipe, and you want the initial
+ open_port call to fail if the configuration is incomplete
+ or wrong. See the erl_driver documentation for more
+ details on the API.</p>
+ <p>
+ Own Id: OTP-13086</p>
+ </item>
+ <item>
+ <p>
+ Erlang linked-in drivers can now set their own pids as
+ seen in <c>erlang:port_info/1</c> by using the
+ <c>erl_drv_set_pid</c> function. For more details see the
+ erl_driver documentation.</p>
+ <p>
+ Own Id: OTP-13087</p>
+ </item>
+ <item>
+ <p>
+ The functionality behind <c>erlang:open_port/2</c> when
+ called with spawn or spawn_executable has been redone so
+ that the forking of the new program is done in a separate
+ process called erl_child_setup. This allows for a much
+ more robust implementation that uses less memory and does
+ not block the entire emulator if the program to be
+ started is on an un-accessible NFS. Benchmarks have shown
+ this approach to be about 3-5 times as fast as the old
+ approach where the fork/vfork was done by erts. This is a
+ pure stability and performance fix, however some error
+ messages may have changed, which is why it is marked as a
+ backwards incompatible change.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13088</p>
+ </item>
+ <item>
+ <p>Improved yielding strategy in the implementation of
+ the following native functions:</p> <list>
+ <item><c>erlang:binary_to_list/1</c></item>
+ <item><c>erlang:binary_to_list/3</c></item>
+ <item><c>erlang:bitstring_to_list/1</c></item>
+ <item><c>erlang:list_to_binary/1</c></item>
+ <item><c>erlang:iolist_to_binary/1</c></item>
+ <item><c>erlang:list_to_bitstring/1</c></item>
+ <item><c>binary:list_to_bin/1</c></item> </list> <p>This
+ in order to improve performance of these functions.</p>
+ <p>
+ Own Id: OTP-13096</p>
+ </item>
+ <item>
+ <p>
+ All garbage collections of processes now bump reductions.
+ Also the amount of reductions bumped when garbage
+ collecting has been adjusted. It now better corresponds
+ to the amount of work performed. This in order to improve
+ the real time characteristics of the system.</p>
+ <p>
+ Own Id: OTP-13097</p>
+ </item>
+ <item>
+ <p>New functions that can load multiple modules at once
+ have been added to the '<c>code</c>' module. The
+ functions are <c>code:atomic_load/1</c>,
+ <c>code:prepare_loading/1</c>,
+ <c>code:finish_loading/1</c>, and
+ <c>code:ensure_modules_loaded/1</c>.</p>
+ <p>
+ Own Id: OTP-13111</p>
+ </item>
+ <item>
+ <p>The <c>-boot_var</c> option for <c>erl</c> now only
+ supports a single key and single value (as documented).
+ The option used to allow multiple key/value pairs, but
+ that behavior was undocumented.</p>
+ <p>The function <c>erl_prim_loader:start/3</c> has been
+ removed. Its documentation has also been removed.</p>
+ <p>The undocumented and unsupported function
+ <c>erl_prim_loader:get_files/2</c> has been removed.</p>
+ <p>
+ Own Id: OTP-13112</p>
+ </item>
+ <item>
+ <p>
+ Low level BIF <c>erlang:purge_module/1</c> is made more
+ robust against incorrect use. Lingering processes that
+ still refer the old code are now killed before the module
+ is purged to prevent fatal VM behavior.</p>
+ <p>
+ Own Id: OTP-13122</p>
+ </item>
+ <item>
+ <p>Improved dirty scheduler implementation. For more
+ information see the <seealso
+ marker="erl_nif#dirty_nifs">NIF
+ documentation</seealso>.</p> <note><list> <item><p>The
+ dirty scheduler support is still
+ <em>experimental</em>.</p></item> <item><p>The support
+ for determining whether dirty NIF support exist or not at
+ compile time using the C preprocessor macro
+ <c>ERL_NIF_DIRTY_SCHEDULER_SUPPORT</c> has been
+ removed.</p></item> <item><p>The
+ <c>enif_is_on_dirty_scheduler()</c> function has been
+ removed. Use <seealso
+ marker="erl_nif#enif_thread_type"><c>enif_thread_type()</c></seealso>
+ instead.</p></item> </list></note>
+ <p>
+ Own Id: OTP-13123</p>
+ </item>
+ <item>
+ <p>
+ Various optimizations done to process dictionary access.</p>
+ <p>
+ Own Id: OTP-13167</p>
+ </item>
+ <item>
+ <p>
+ Added max_heap_size process flag. max_heap_size allows
+ the user to limit the maximum heap used by a process. See
+ <seealso
+ marker="erlang#process_flag/2">erlang:process_flag</seealso>
+ for more details.</p>
+ <p>
+ Own Id: OTP-13174</p>
+ </item>
+ <item>
+ <p>
+ Allow dynamic drivers and NIF libraries to be built with
+ gcc option <c>-fvisibility=hidden</c> for faster loading
+ and more optimized code.</p>
+ <p>
+ Own Id: OTP-13227</p>
+ </item>
+ <item>
+ <p>
+ Add <c>erlang:process_info(Pid,
+ garbage_collection_info)</c> which returns extended
+ garbage_collection information. For more details see the
+ documentation.</p>
+ <p>
+ Own Id: OTP-13265</p>
+ </item>
+ <item>
+ <p>
+ The functions <c>erlang:list_to_integer/1</c> and
+ <c>string:to_integer/1</c> have been optimized for large
+ inputs.</p>
+ <p>
+ Own Id: OTP-13293</p>
+ </item>
+ <item>
+ <p>
+ Improved memory allocation strategy for hipe native code
+ on x86_64 (amd64) architectures by reserving enough low
+ virtual address space needed for the HiPE/AMD64 small
+ code model. The default virtual address area for hipe
+ code is set to 512Mb, but can be changed with emulator
+ flag <c>+MXscs</c>.</p>
+ <p>
+ Own Id: OTP-13359</p>
+ </item>
+ <item>
+ <p>
+ Introduction of configurable management of data referred
+ to by the message queue of a process. Each process can be
+ configured individually.</p>
+ <p>
+ It is now possible to configure the message queue of a
+ process, so that all data referred by it will be kept
+ outside of the heap, and by this prevent this data from
+ being part of garbage collections.</p>
+ <p>
+ For more information see the documentation of <seealso
+ marker="erlang#process_flag_message_queue_data"><c>process_flag(message_queue_data,
+ MQD)</c></seealso>.</p>
+ <p>
+ Own Id: OTP-13366 Aux Id: OTP-13047 </p>
+ </item>
+ <item>
+ <p>
+ Processes now yield when scanning large message queues
+ and not finding a matching message. This in order to
+ improve real time characteristics.</p>
+ <p>
+ Own Id: OTP-13401</p>
+ </item>
+ <item>
+ <p>
+ Optimized an erts internal function that is used to
+ traverse erlang terms. The internal function was mainly
+ used by term_to_binary and comparison of terms.
+ Benchmarks have shown up to a 10% performance increase in
+ those functions after the optimization.</p>
+ <p>
+ Own Id: OTP-13440</p>
+ </item>
+ <item>
+ <p>
+ Add the following NIF API functions:</p>
+ <p>
+ <list> <item><seealso
+ marker="erl_nif#enif_cpu_time"><c>enif_cpu_time</c></seealso></item>
+ <item><seealso
+ marker="erl_nif#enif_now_time"><c>enif_now_time</c></seealso></item>
+ <item><seealso
+ marker="erl_nif#enif_make_unique_integer"><c>enif_make_unique_integer</c></seealso></item>
+ <item><seealso
+ marker="erl_nif#enif_is_process_alive"><c>enif_is_process_alive</c></seealso></item>
+ <item><seealso
+ marker="erl_nif#enif_is_port_alive"><c>enif_is_port_alive</c></seealso></item>
+ <item><seealso
+ marker="erl_nif#enif_term_to_binary"><c>enif_term_to_binary</c></seealso></item>
+ <item><seealso
+ marker="erl_nif#enif_binary_to_term"><c>enif_binary_to_term</c></seealso></item>
+ <item><seealso
+ marker="erl_nif#enif_port_command"><c>enif_port_command</c></seealso></item>
+ </list></p>
+ <p>
+ for details of what each function does, see the erl_nif
+ documentation.</p>
+ <p>
+ Own Id: OTP-13442</p>
+ </item>
+ <item>
+ <p>
+ Optimize <c>'++'</c> operator and <c>lists:append/2</c>
+ by using a single pass to build a new list while checking
+ for properness.</p>
+ <p>
+ Own Id: OTP-13487</p>
+ </item>
+ <item>
+ <p>
+ Handle terms (pids,ports and refs) from nodes with a
+ 'creation' value larger than 3. This is a preparation of
+ the distribution protocol to allow OTP 19 nodes to
+ correctly communicate with future nodes (20 or higher).
+ The 'creation' value differentiates different
+ incarnations of the same node (name).</p>
+ <p>
+ Own Id: OTP-13488</p>
+ </item>
+ <item>
+ <p>
+ Don't send unasked for systemd notifications in epmd</p>
+ <p>
+ Own Id: OTP-13493 Aux Id: PR-999 </p>
+ </item>
+ <item>
+ <p>
+ The enif_send API has been extended to allow NULL to be
+ used as the message environment. When used this way, a
+ message environment is implicitly created and the given
+ term is copied into that environment before sending. This
+ can be an optimization if many small messages are being
+ sent by the nif.</p>
+ <p>
+ Own Id: OTP-13495</p>
+ </item>
+ <item>
+ <p>
+ The tracing support has been extended to allow tracing on
+ ports. Ports can be traced on using the 'ports', 'send'
+ and 'receive' trace flags.</p>
+ <p>
+ The first argument of <seealso
+ marker="erts:erlang#trace/3">erlang:trace/3</seealso> has
+ been extended so that <c>'all'</c>, <c>'existing'</c> and
+ <c>'new'</c> now include both processes and ports. New
+ <c>Tracee</c> variants, <c>'all_processes'</c>,
+ <c>'all_ports'</c>, <c>'existing_processes'</c> etc have
+ been added to specify only processes or ports.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13496</p>
+ </item>
+ <item>
+ <p>
+ When the <c>'procs'</c> trace flag is enabled, a
+ <c>'spawned'</c> trace event is now also generated by a
+ newly created process. The previous event <c>'spawn'</c>
+ remains, but as it is generated by the process that did
+ the spawn, it is not guaranteed that it is ordered with
+ other trace events from the newly spawned process. So
+ when tracking the lifetime of a process this new event
+ should be used as the creation event.</p>
+ <p>
+ This new trace event is marked as an incompatibility
+ because tools that expect certain trace events when
+ enabling 'procs' will have to updated.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13497</p>
+ </item>
+ <item>
+ <p>
+ Add the <seealso
+ marker="erts:erlang#match_spec_test/3">erlang:match_spec_test/3</seealso>
+ function. The functions allows the testing of match
+ specifications for both tracing and ets tables. It can be
+ used to test that a match specification does the expected
+ filtering on specific data. It also returns more verbose
+ error reasons for incorrectly constructed match
+ specifications.</p>
+ <p>
+ Own Id: OTP-13501</p>
+ </item>
+ <item>
+ <p>
+ The erts internal tracing support has been changed to
+ have much less overhead and be more scalable.</p>
+ <p>
+ This rewrite does not break any backwards
+ incompatibilities, but it does change the ordering of
+ some trace messages when compared to previous releases.
+ It should be noted that this only applies to trace
+ messages sent to processes or ports, it does not apply to
+ the new tracer module. However in future releases they
+ may also be effected by this.</p>
+ <p>
+ Trace messages are only guaranteed to be ordered from one
+ traced process or port. In previous releases this was not
+ visible as a <c>'send'</c> trace message would always
+ arrive before the corresponding <c>'receive'</c> trace
+ message that is no longer always the case. This also
+ means that timestamped trace messages may seem to arrive
+ out of order as the timestamp is taken when the event is
+ triggered and not when it is put in the queue of the
+ tracer.</p>
+ <p>
+ Own Id: OTP-13503</p>
+ </item>
+ <item>
+ <p>
+ Add possibility to filter <c>send</c> and <c>receive</c>
+ trace with match specifications.</p>
+ <p>
+ Own Id: OTP-13507</p>
+ </item>
+ <item>
+ <p>
+ Add <c>maps:update_with/3,4</c> and <c>maps:take/2</c></p>
+ <p>
+ Own Id: OTP-13522 Aux Id: PR-1025 </p>
+ </item>
+ <item>
+ <p>
+ Introduce LTTng tracing via Erlang tracing.</p>
+ <p>
+ For LTTng to be enabled OTP needs to be built with
+ configure option <c>--with-dynamic-trace=lttng</c>.</p>
+ <p>The dynamic trace module <c>dyntrace</c> is now
+ capable to be used as a LTTng sink for Erlang tracing.
+ For a list of all tracepoints, see <seealso
+ marker="runtime_tools:LTTng">Runtime Tools User's
+ Guide</seealso> .</p>
+ <p>This feature also introduces an incompatible change in
+ trace tags. The trace tags <c>gc_start</c> and
+ <c>gc_end</c> has been split into <c>gc_minor_start</c>,
+ <c>gc_minor_end</c> and <c>gc_major_start</c>,
+ <c>gc_major_end</c>.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13532</p>
+ </item>
+ <item>
+ <p>
+ Print heap pointers for garbing processes during
+ crashdump</p>
+ <p>
+ Own Id: OTP-13541 Aux Id: PR-1026 </p>
+ </item>
+ <item>
+ <p>
+ Changed and improved low level memory statistics returned
+ by <c>erlang:system_info/1</c>. The info for
+ <c>erts_mmap</c> has been moved from <c>mseg_alloc</c> to
+ its own section returned by <c>{allocator,
+ erts_mmap}</c>.</p>
+ <p>
+ Own Id: OTP-13560</p>
+ </item>
+ <item>
+ <p>
+ Add enif_snprintf to the NIF API</p>
+ <p>
+ The function <c>enif_snprintf</c> is similar to
+ <c>snprintf</c> call but can handle formatting of Erlang
+ terms via <c>%T</c> format specifier.</p>
+ <p>
+ Own Id: OTP-13580</p>
+ </item>
+ <item>
+ <p>The warning in the documentation for
+ <c>erlang:raise/3</c> has been removed. It is now
+ officially perfectly fine to use raise/3 in production
+ code.</p>
+ <p>
+ Own Id: OTP-13599</p>
+ </item>
+ <item>
+ <p>
+ Fix bugs caused by the VM sometimes truncating object
+ sizes or offsets to 32 bits on 64-bit hosts. These bugs
+ were mainly found when working with large unicode strings
+ and nifs environments.</p>
+ <p>
+ Own Id: OTP-13606</p>
+ </item>
+ <item>
+ <p>
+ Add <c>-start_epmd</c> command line option, this lets you
+ disable automatic starting of epmd when starting a
+ distributed node.</p>
+ <p>
+ Add <c>-epmd_module</c> command line option, this lets
+ you specify a module to register and look-up node names
+ in. The default module is <c>erl_epmd</c>.</p>
+ <p>
+ Own Id: OTP-13627</p>
+ </item>
+ <item>
+ <p>
+ <c>erlang:halt</c> now truncates strings longer than 200
+ characters instead of failing with <c>badarg</c>.</p>
+ <p>
+ Own Id: OTP-13630</p>
+ </item>
+ <item>
+ <p>
+ Fix possible race in poller wake up on windows</p>
+ <p>
+ Own Id: OTP-13634</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Erts 7.3.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/erts/emulator/sys/unix/sys_drivers.c b/erts/emulator/sys/unix/sys_drivers.c
index ac39b8a389..812112fb91 100644
--- a/erts/emulator/sys/unix/sys_drivers.c
+++ b/erts/emulator/sys/unix/sys_drivers.c
@@ -762,7 +762,7 @@ static ErlDrvData spawn_start(ErlDrvPort port_num, char* name,
}
}
- if (res < buffsz) {
+ if (res < (buffsz + sizeof(buffsz))) {
/* we only wrote part of the command payload. Enqueue the rest. */
for (i = 0; i < iov_len; i++) {
driver_enq(port_num, io_vector[i].iov_base, io_vector[i].iov_len);
diff --git a/erts/preloaded/ebin/erl_prim_loader.beam b/erts/preloaded/ebin/erl_prim_loader.beam
index 66e443f396..796cbd74c5 100644
--- a/erts/preloaded/ebin/erl_prim_loader.beam
+++ b/erts/preloaded/ebin/erl_prim_loader.beam
Binary files differ
diff --git a/erts/preloaded/ebin/erl_tracer.beam b/erts/preloaded/ebin/erl_tracer.beam
index 22286ed221..4406a82a36 100644
--- a/erts/preloaded/ebin/erl_tracer.beam
+++ b/erts/preloaded/ebin/erl_tracer.beam
Binary files differ
diff --git a/erts/preloaded/ebin/erlang.beam b/erts/preloaded/ebin/erlang.beam
index cde8c9ab72..b62da04bfd 100644
--- a/erts/preloaded/ebin/erlang.beam
+++ b/erts/preloaded/ebin/erlang.beam
Binary files differ
diff --git a/erts/preloaded/ebin/erts_code_purger.beam b/erts/preloaded/ebin/erts_code_purger.beam
index b1da0aa861..a0da864824 100644
--- a/erts/preloaded/ebin/erts_code_purger.beam
+++ b/erts/preloaded/ebin/erts_code_purger.beam
Binary files differ
diff --git a/erts/preloaded/ebin/erts_internal.beam b/erts/preloaded/ebin/erts_internal.beam
index cc4f3dbdaf..d897c8e92f 100644
--- a/erts/preloaded/ebin/erts_internal.beam
+++ b/erts/preloaded/ebin/erts_internal.beam
Binary files differ
diff --git a/erts/preloaded/ebin/init.beam b/erts/preloaded/ebin/init.beam
index 6fc95b914e..b856bff4fe 100644
--- a/erts/preloaded/ebin/init.beam
+++ b/erts/preloaded/ebin/init.beam
Binary files differ
diff --git a/erts/preloaded/ebin/otp_ring0.beam b/erts/preloaded/ebin/otp_ring0.beam
index f893b9c181..b601c048b3 100644
--- a/erts/preloaded/ebin/otp_ring0.beam
+++ b/erts/preloaded/ebin/otp_ring0.beam
Binary files differ
diff --git a/erts/preloaded/ebin/prim_eval.beam b/erts/preloaded/ebin/prim_eval.beam
index e4ce601c03..77909b01f0 100644
--- a/erts/preloaded/ebin/prim_eval.beam
+++ b/erts/preloaded/ebin/prim_eval.beam
Binary files differ
diff --git a/erts/preloaded/ebin/prim_file.beam b/erts/preloaded/ebin/prim_file.beam
index babba3081f..5bbbaf14d5 100644
--- a/erts/preloaded/ebin/prim_file.beam
+++ b/erts/preloaded/ebin/prim_file.beam
Binary files differ
diff --git a/erts/preloaded/ebin/prim_inet.beam b/erts/preloaded/ebin/prim_inet.beam
index fdf8bbf4e2..fba03d52bd 100644
--- a/erts/preloaded/ebin/prim_inet.beam
+++ b/erts/preloaded/ebin/prim_inet.beam
Binary files differ
diff --git a/erts/preloaded/ebin/prim_zip.beam b/erts/preloaded/ebin/prim_zip.beam
index e1faca7d96..6afeb454d6 100644
--- a/erts/preloaded/ebin/prim_zip.beam
+++ b/erts/preloaded/ebin/prim_zip.beam
Binary files differ
diff --git a/erts/preloaded/ebin/zlib.beam b/erts/preloaded/ebin/zlib.beam
index 5d3cbc1b36..4c48742344 100644
--- a/erts/preloaded/ebin/zlib.beam
+++ b/erts/preloaded/ebin/zlib.beam
Binary files differ
diff --git a/lib/asn1/doc/src/notes.xml b/lib/asn1/doc/src/notes.xml
index 7af6ad72d2..68d335f451 100644
--- a/lib/asn1/doc/src/notes.xml
+++ b/lib/asn1/doc/src/notes.xml
@@ -32,6 +32,21 @@
<p>This document describes the changes made to the asn1 application.</p>
+<section><title>Asn1 4.0.3</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Asn1 4.0.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/asn1/vsn.mk b/lib/asn1/vsn.mk
index ab2c127ca2..527af05da1 100644
--- a/lib/asn1/vsn.mk
+++ b/lib/asn1/vsn.mk
@@ -1 +1 @@
-ASN1_VSN = 4.0.2
+ASN1_VSN = 4.0.3
diff --git a/lib/common_test/doc/src/notes.xml b/lib/common_test/doc/src/notes.xml
index ebba864606..32ae699c7a 100644
--- a/lib/common_test/doc/src/notes.xml
+++ b/lib/common_test/doc/src/notes.xml
@@ -33,6 +33,31 @@
<file>notes.xml</file>
</header>
+<section><title>Common_Test 1.12.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The following modules were missing in
+ common_test.app.src: ct_groups, ct_property_test,
+ ct_release_test, ct_webtool, ct_webtool_sup,
+ test_server_gl. They have now been added.</p>
+ <p>
+ Own Id: OTP-13475</p>
+ </item>
+ <item>
+ <p>
+ Common Test printed incorrect timestamps for received
+ error reports.</p>
+ <p>
+ Own Id: OTP-13615 Aux Id: seq13124 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Common_Test 1.12.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/common_test/test/ct_netconfc_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE.erl
index 2919f01605..8932f930d1 100644
--- a/lib/common_test/test/ct_netconfc_SUITE.erl
+++ b/lib/common_test/test/ct_netconfc_SUITE.erl
@@ -55,7 +55,7 @@ check_crypto_and_ssh() ->
(catch code:load_file(crypto)),
case code:is_loaded(crypto) of
{file,_} ->
- case ssh:start() of
+ case catch ssh:start() of
Ok when Ok==ok; Ok=={error,{already_started,ssh}} ->
ct:log("ssh started",[]),
ok;
diff --git a/lib/common_test/vsn.mk b/lib/common_test/vsn.mk
index 2fab4d3883..c68750886a 100644
--- a/lib/common_test/vsn.mk
+++ b/lib/common_test/vsn.mk
@@ -1 +1 @@
-COMMON_TEST_VSN = 1.13
+COMMON_TEST_VSN = 1.12.2
diff --git a/lib/compiler/doc/src/notes.xml b/lib/compiler/doc/src/notes.xml
index ae375c5f58..e25cdc580c 100644
--- a/lib/compiler/doc/src/notes.xml
+++ b/lib/compiler/doc/src/notes.xml
@@ -32,6 +32,100 @@
<p>This document describes the changes made to the Compiler
application.</p>
+<section><title>Compiler 7.0</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p><c>compile:forms/1,2</c> would crash when used in a
+ working directory that had been deleted by another
+ process.</p>
+ <p>
+ Own Id: OTP-13430 Aux Id: ERL-113 </p>
+ </item>
+ <item>
+ <p>Dialyzer no longer crashes when there is an invalid
+ function call such as <c>42(7)</c> in a module being
+ analyzed. The compiler will now warn for invalid function
+ calls such as <c>X = 42, x(7)</c>.</p>
+ <p>
+ Own Id: OTP-13552 Aux Id: ERL-138 </p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Optimization of tuple matching has been slightly
+ improved.</p>
+ <p>
+ Own Id: OTP-12951</p>
+ </item>
+ <item>
+ <p>Five deprecated and undocumented functions in the
+ module <c>core_lib</c> have been removed. The functions
+ are: <c>get_anno/{1,2}</c>, <c>is_literal/1</c>,
+ <c>is_literal_list/1</c>, and <c>literal_value</c>. Use
+ the appropriate functions in the <c>cerl</c> module
+ instead.</p>
+ <p>
+ Own Id: OTP-12979</p>
+ </item>
+ <item>
+ <p>The pre-processor can now expand the ?FUNCTION_NAME
+ and ?FUNCTION_ARITY macros.</p>
+ <p>
+ Own Id: OTP-13059</p>
+ </item>
+ <item>
+ <p>The function mapfold/4 has been added to the
+ <c>cerl_trees</c> module.</p>
+ <p>
+ Own Id: OTP-13280</p>
+ </item>
+ <item>
+ <p>Bitstring comprehensions have been generalized to
+ allow arbitrary expressions in the construction part.</p>
+ <p>
+ Own Id: OTP-13289</p>
+ </item>
+ <item>
+ <p>The compiler will now produce warnings for binary
+ patterns that will never match (example:
+ <c>&lt;&lt;-1/unsigned&gt;&gt; = Bin</c>). </p>
+ <p>
+ Own Id: OTP-13374 Aux Id: ERL-44 </p>
+ </item>
+ <item>
+ <p>The compiler will no longer put the compilation date
+ and time into BEAM files. That means that two BEAM files
+ compiled on the same computer from the same source code
+ and compilation options will be identical.</p>
+ <p>Note: If you want to find out whether a BEAM file on
+ disk is different from the loaded code, compared the MD5
+ value obtained from <c>Mod:module_info(md5)</c> with the
+ MD5 value obtained from
+ <c>beam_lib:md5(BeamFileForMod)</c></p>.
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13504</p>
+ </item>
+ <item>
+ <p>The function <c>compile:env_compiler_options/0</c> has
+ been added to allow tools to pick up the same default
+ compiler options as the compiler itself.</p>
+ <p>
+ Own Id: OTP-13654</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Compiler 6.0.3</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl
index b716867f2f..e951a25e04 100644
--- a/lib/compiler/src/compile.erl
+++ b/lib/compiler/src/compile.erl
@@ -240,6 +240,8 @@ format_error({epp,E}) ->
epp:format_error(E);
format_error(write_error) ->
"error writing file";
+format_error({write_error, Error}) ->
+ io_lib:format("error writing file: ~ts", [file:format_error(Error)]);
format_error({rename,From,To,Error}) ->
io_lib:format("failed to rename ~ts to ~ts: ~ts",
[From,To,file:format_error(Error)]);
@@ -1210,7 +1212,7 @@ makedep_output(#compile{code=Code,options=Opts,ofile=Ofile}=St) ->
end,
{ok,St}
catch
- exit:_ ->
+ error:_ ->
%% Couldn't write to output Makefile.
Err = {St#compile.ifile,[{none,?MODULE,write_error}]},
{error,St#compile{errors=St#compile.errors++[Err]}}
@@ -1483,8 +1485,8 @@ save_binary_1(St) ->
end,
{error,St#compile{errors=St#compile.errors ++ Es}}
end;
- {error,_Error} ->
- Es = [{Tfile,[{none,compile,write_error}]}],
+ {error,Error} ->
+ Es = [{Tfile,[{none,compile,{write_error,Error}}]}],
{error,St#compile{errors=St#compile.errors ++ Es}}
end.
@@ -1632,8 +1634,8 @@ listing(LFun, Ext, St) ->
LFun(Lf, Code),
ok = file:close(Lf),
{ok,St};
- {error,_Error} ->
- Es = [{Lfile,[{none,compile,write_error}]}],
+ {error,Error} ->
+ Es = [{Lfile,[{none,compile,{write_error,Error}}]}],
{error,St#compile{errors=St#compile.errors ++ Es}}
end.
diff --git a/lib/compiler/vsn.mk b/lib/compiler/vsn.mk
index c83455240d..23dd4bd4b1 100644
--- a/lib/compiler/vsn.mk
+++ b/lib/compiler/vsn.mk
@@ -1 +1 @@
-COMPILER_VSN = 6.0.3
+COMPILER_VSN = 7.0
diff --git a/lib/cosEvent/doc/src/notes.xml b/lib/cosEvent/doc/src/notes.xml
index 83fa5fa4b7..fe94cb64d3 100644
--- a/lib/cosEvent/doc/src/notes.xml
+++ b/lib/cosEvent/doc/src/notes.xml
@@ -33,7 +33,22 @@
<file>notes.xml</file>
</header>
- <section><title>cosEvent 2.2</title>
+ <section><title>cosEvent 2.2.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>cosEvent 2.2</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/cosEvent/vsn.mk b/lib/cosEvent/vsn.mk
index 3149020d7c..c39bed9fe4 100644
--- a/lib/cosEvent/vsn.mk
+++ b/lib/cosEvent/vsn.mk
@@ -1,2 +1,2 @@
-COSEVENT_VSN = 2.2
+COSEVENT_VSN = 2.2.1
diff --git a/lib/cosEventDomain/doc/src/notes.xml b/lib/cosEventDomain/doc/src/notes.xml
index 5617efe697..5e5bb2c33e 100644
--- a/lib/cosEventDomain/doc/src/notes.xml
+++ b/lib/cosEventDomain/doc/src/notes.xml
@@ -32,7 +32,22 @@
<file>notes.xml</file>
</header>
- <section><title>cosEventDomain 1.2</title>
+ <section><title>cosEventDomain 1.2.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>cosEventDomain 1.2</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/cosEventDomain/vsn.mk b/lib/cosEventDomain/vsn.mk
index bdde1f6ab2..4e10d6ac60 100644
--- a/lib/cosEventDomain/vsn.mk
+++ b/lib/cosEventDomain/vsn.mk
@@ -1,2 +1,2 @@
-COSEVENTDOMAIN_VSN = 1.2
+COSEVENTDOMAIN_VSN = 1.2.1
diff --git a/lib/cosFileTransfer/doc/src/notes.xml b/lib/cosFileTransfer/doc/src/notes.xml
index eacc75062b..58ab087014 100644
--- a/lib/cosFileTransfer/doc/src/notes.xml
+++ b/lib/cosFileTransfer/doc/src/notes.xml
@@ -31,7 +31,22 @@
<file>notes.xml</file>
</header>
- <section><title>cosFileTransfer 1.2</title>
+ <section><title>cosFileTransfer 1.2.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>cosFileTransfer 1.2</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/cosFileTransfer/vsn.mk b/lib/cosFileTransfer/vsn.mk
index 00bfdb3087..e271c05242 100644
--- a/lib/cosFileTransfer/vsn.mk
+++ b/lib/cosFileTransfer/vsn.mk
@@ -1 +1 @@
-COSFILETRANSFER_VSN = 1.2
+COSFILETRANSFER_VSN = 1.2.1
diff --git a/lib/cosNotification/doc/src/notes.xml b/lib/cosNotification/doc/src/notes.xml
index 3f3f0be3e7..1237000153 100644
--- a/lib/cosNotification/doc/src/notes.xml
+++ b/lib/cosNotification/doc/src/notes.xml
@@ -32,7 +32,22 @@
<file>notes.xml</file>
</header>
- <section><title>cosNotification 1.2.1</title>
+ <section><title>cosNotification 1.2.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>cosNotification 1.2.1</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/cosNotification/vsn.mk b/lib/cosNotification/vsn.mk
index 07b9bf474b..0d95ab4853 100644
--- a/lib/cosNotification/vsn.mk
+++ b/lib/cosNotification/vsn.mk
@@ -1,2 +1,2 @@
-COSNOTIFICATION_VSN = 1.2.1
+COSNOTIFICATION_VSN = 1.2.2
diff --git a/lib/cosProperty/doc/src/notes.xml b/lib/cosProperty/doc/src/notes.xml
index 4ec7eca94a..d5219fc110 100644
--- a/lib/cosProperty/doc/src/notes.xml
+++ b/lib/cosProperty/doc/src/notes.xml
@@ -32,7 +32,22 @@
<file>notes.xml</file>
</header>
- <section><title>cosProperty 1.2</title>
+ <section><title>cosProperty 1.2.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>cosProperty 1.2</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/cosProperty/vsn.mk b/lib/cosProperty/vsn.mk
index d96508c2d2..1a8e42ffdb 100644
--- a/lib/cosProperty/vsn.mk
+++ b/lib/cosProperty/vsn.mk
@@ -1,2 +1,2 @@
-COSPROPERTY_VSN = 1.2
+COSPROPERTY_VSN = 1.2.1
diff --git a/lib/cosTime/doc/src/notes.xml b/lib/cosTime/doc/src/notes.xml
index 62c1aa3c26..686d9e6add 100644
--- a/lib/cosTime/doc/src/notes.xml
+++ b/lib/cosTime/doc/src/notes.xml
@@ -33,7 +33,22 @@
<file>notes.xml</file>
</header>
- <section><title>cosTime 1.2.1</title>
+ <section><title>cosTime 1.2.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>cosTime 1.2.1</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/cosTime/vsn.mk b/lib/cosTime/vsn.mk
index 39b457b53b..7c9cae2d2f 100644
--- a/lib/cosTime/vsn.mk
+++ b/lib/cosTime/vsn.mk
@@ -1,2 +1,2 @@
-COSTIME_VSN = 1.2.1
+COSTIME_VSN = 1.2.2
diff --git a/lib/cosTransactions/doc/src/notes.xml b/lib/cosTransactions/doc/src/notes.xml
index b681330391..85ace1208b 100644
--- a/lib/cosTransactions/doc/src/notes.xml
+++ b/lib/cosTransactions/doc/src/notes.xml
@@ -33,7 +33,22 @@
<file>notes.xml</file>
</header>
- <section><title>cosTransactions 1.3.1</title>
+ <section><title>cosTransactions 1.3.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>cosTransactions 1.3.1</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/cosTransactions/vsn.mk b/lib/cosTransactions/vsn.mk
index 3a18cae384..ab163d83c2 100644
--- a/lib/cosTransactions/vsn.mk
+++ b/lib/cosTransactions/vsn.mk
@@ -1 +1 @@
-COSTRANSACTIONS_VSN = 1.3.1
+COSTRANSACTIONS_VSN = 1.3.2
diff --git a/lib/crypto/doc/src/notes.xml b/lib/crypto/doc/src/notes.xml
index 6c76a0d7b0..7d3a85326f 100644
--- a/lib/crypto/doc/src/notes.xml
+++ b/lib/crypto/doc/src/notes.xml
@@ -31,6 +31,52 @@
</header>
<p>This document describes the changes made to the Crypto application.</p>
+<section><title>Crypto 3.7</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Refactor <c>crypto</c> to use the EVP interface of
+ OpenSSL, which is the recommended interface that also
+ enables access to hardware acceleration for some
+ operations.</p>
+ <p>
+ Own Id: OTP-12217</p>
+ </item>
+ <item>
+ <p>
+ Add support for 192-bit keys for the <c>aes_cbc</c>
+ cipher.</p>
+ <p>
+ Own Id: OTP-13206 Aux Id: pr 832 </p>
+ </item>
+ <item>
+ <p>
+ Add support for 192-bit keys for <c>aes_ecb</c>.</p>
+ <p>
+ Own Id: OTP-13207 Aux Id: pr829 </p>
+ </item>
+ <item>
+ <p>
+ Deprecate the function <c>crypto:rand_bytes</c> and make
+ sure that <c>crypto:strong_rand_bytes</c> is used in all
+ places that are cryptographically significant.</p>
+ <p>
+ Own Id: OTP-13214</p>
+ </item>
+ <item>
+ <p>
+ Enable AES-GCM encryption/decryption to change the tag
+ length between 1 to 16 bytes.</p>
+ <p>
+ Own Id: OTP-13483 Aux Id: PR-998 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Crypto 3.6.3</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/crypto/vsn.mk b/lib/crypto/vsn.mk
index 6dcb28ec8a..96466869d1 100644
--- a/lib/crypto/vsn.mk
+++ b/lib/crypto/vsn.mk
@@ -1 +1 @@
-CRYPTO_VSN = 3.6.3
+CRYPTO_VSN = 3.7
diff --git a/lib/debugger/doc/src/notes.xml b/lib/debugger/doc/src/notes.xml
index 3028d8dd41..2e0d834269 100644
--- a/lib/debugger/doc/src/notes.xml
+++ b/lib/debugger/doc/src/notes.xml
@@ -33,6 +33,22 @@
<p>This document describes the changes made to the Debugger
application.</p>
+<section><title>Debugger 4.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>When the debugger searches for source files, it will
+ also use the location of the source in the compilation
+ information part of the BEAM file.</p>
+ <p>
+ Own Id: OTP-13375</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Debugger 4.1.2</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/debugger/vsn.mk b/lib/debugger/vsn.mk
index cf8ffd3272..dd496013cd 100644
--- a/lib/debugger/vsn.mk
+++ b/lib/debugger/vsn.mk
@@ -1 +1 @@
-DEBUGGER_VSN = 4.1.2
+DEBUGGER_VSN = 4.2
diff --git a/lib/dialyzer/doc/src/notes.xml b/lib/dialyzer/doc/src/notes.xml
index d9af2cb4cd..a5a52fee61 100644
--- a/lib/dialyzer/doc/src/notes.xml
+++ b/lib/dialyzer/doc/src/notes.xml
@@ -32,6 +32,88 @@
<p>This document describes the changes made to the Dialyzer
application.</p>
+<section><title>Dialyzer 3.0</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p> Fix a bug in the translation of forms to types. </p>
+ <p>
+ Own Id: OTP-13520</p>
+ </item>
+ <item>
+ <p>Correct misspelling in Dialyzer's acronym definition.
+ </p>
+ <p>
+ Own Id: OTP-13544 Aux Id: PR-1007 </p>
+ </item>
+ <item>
+ <p>Dialyzer no longer crashes when there is an invalid
+ function call such as <c>42(7)</c> in a module being
+ analyzed. The compiler will now warn for invalid function
+ calls such as <c>X = 42, x(7)</c>.</p>
+ <p>
+ Own Id: OTP-13552 Aux Id: ERL-138 </p>
+ </item>
+ <item>
+ <p> Fix a bug that caused Dialyzer to go into an infinite
+ loop. </p>
+ <p>
+ Own Id: OTP-13653 Aux Id: ERL-157 </p>
+ </item>
+ <item>
+ <p>Fix a bug in Dialyzer related to call-site
+ analysis.</p>
+ <p>
+ Own Id: OTP-13655 Aux Id: PR-1092 </p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p> The evaluation of SCCs in <c>dialyzer_typesig</c> is
+ optimized. </p> <p> Maps are used instead of Dicts to
+ further optimize the evaluation. </p>
+ <p>
+ Own Id: OTP-10349</p>
+ </item>
+ <item>
+ <p> Since Erlang/OTP R14A, when support for parameterized
+ modules was added, <c>module()</c> has included
+ <c>tuple()</c>, but that part is removed; the type
+ <c>module()</c> is now the same as <c>atom()</c>, as
+ documented in the Reference Manual. </p>
+ <p>
+ Own Id: OTP-13244</p>
+ </item>
+ <item>
+ <p> The type specification syntax for Maps is improved:
+ </p> <list> <item> <p> The association type <c>KeyType :=
+ ValueType</c> denotes an association that must be
+ present. </p> </item> <item> <p> The shorthand <c>...</c>
+ stands for the association type <c>any() => any()</c>.
+ </p> </item> </list> <p> An incompatible change is that
+ <c>#{}</c> stands for the empty map. The type
+ <c>map()</c> (a map of any size) can be written as
+ <c>#{...}</c>. </p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13542 Aux Id: PR-1014 </p>
+ </item>
+ <item>
+ <p>The translation of forms to types is improved. </p>
+ <p>
+ Own Id: OTP-13547</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Dialyzer 2.9</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/diameter/doc/src/notes.xml b/lib/diameter/doc/src/notes.xml
index 82448e7f51..b1be7bdcf7 100644
--- a/lib/diameter/doc/src/notes.xml
+++ b/lib/diameter/doc/src/notes.xml
@@ -43,6 +43,41 @@ first.</p>
<!-- ===================================================================== -->
+<section><title>diameter 1.12</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Ensure listening socket is closed at transport removal.</p>
+ <p>
+ Transport removal did not immediately close a
+ <c>diameter_tcp/sctp</c> listening socket, and a
+ subsequent peer connection caused it to remain open.</p>
+ <p>
+ Own Id: OTP-13611</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Add <c>diameter:peer_info/1</c>.</p>
+ <p>
+ That retrieves information in the style of
+ <c>diameter:service_info/2</c>, but for a single peer
+ connection.</p>
+ <p>
+ Own Id: OTP-13508</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>diameter 1.11.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/edoc/doc/src/notes.xml b/lib/edoc/doc/src/notes.xml
index 130a5a850e..ae8147c564 100644
--- a/lib/edoc/doc/src/notes.xml
+++ b/lib/edoc/doc/src/notes.xml
@@ -32,6 +32,20 @@
<p>This document describes the changes made to the EDoc
application.</p>
+<section><title>Edoc 0.7.19</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p> Handle typed record fields. </p>
+ <p>
+ Own Id: OTP-13558</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Edoc 0.7.18</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/edoc/vsn.mk b/lib/edoc/vsn.mk
index 83514ac94f..f38800b3e0 100644
--- a/lib/edoc/vsn.mk
+++ b/lib/edoc/vsn.mk
@@ -1 +1 @@
-EDOC_VSN = 0.7.18
+EDOC_VSN = 0.7.19
diff --git a/lib/eldap/doc/src/notes.xml b/lib/eldap/doc/src/notes.xml
index aa3e3137ae..7aad745f67 100644
--- a/lib/eldap/doc/src/notes.xml
+++ b/lib/eldap/doc/src/notes.xml
@@ -31,6 +31,39 @@
</header>
<p>This document describes the changes made to the Eldap application.</p>
+<section><title>Eldap 1.2.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ If the underlying tcp connection is closed and an LDAP
+ operation returned tcp_error, the client applications
+ tend to close the ldap handle with eldap:close. This will
+ cause a <c>{nocatch, {gen_tcp_error, ...}}</c> exception.</p>
+ <p>
+ Such errors are now ignored during close, because the
+ socket will be closed anyway.</p>
+ <p>
+ Own Id: OTP-13590 Aux Id: PR-1048 </p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Modernize test suites</p>
+ <p>
+ Own Id: OTP-13566</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Eldap 1.2.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/erl_docgen/doc/src/notes.xml b/lib/erl_docgen/doc/src/notes.xml
index be94c0a7a0..21dc617d55 100644
--- a/lib/erl_docgen/doc/src/notes.xml
+++ b/lib/erl_docgen/doc/src/notes.xml
@@ -31,7 +31,52 @@
</header>
<p>This document describes the changes made to the <em>erl_docgen</em> application.</p>
- <section><title>Erl_Docgen 0.4.2</title>
+ <section><title>Erl_Docgen 0.5</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p> Generate HTML anchors for data types without
+ <c>name</c> attribute. </p>
+ <p>
+ Own Id: OTP-13600 Aux Id: Jira: ERL-141 </p>
+ </item>
+ <item>
+ <p> Updated make rules so it's possible to use the
+ xmllint target for checking the system
+ documentation.<br/> Removed usage of non defined DTD tag
+ (output) from the system documentation and corrected a
+ number of xml faults. </p> <p> Added support for quote
+ tag and a new level of header formatting in erl_docgen.
+ </p> <p> A fault when generating html for manual set
+ markers for section headings is corrected so now is the
+ title visible after hyperlink jump. </p>
+ <p>
+ Own Id: OTP-13638</p>
+ </item>
+ <item>
+ <p> Corrected the space handling for the seealso tag.
+ </p>
+ <p>
+ Own Id: OTP-13639</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p> Sort the modules function index alphabetically. </p>
+ <p>
+ Own Id: OTP-13668 Aux Id: PR-543 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Erl_Docgen 0.4.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
diff --git a/lib/erl_docgen/vsn.mk b/lib/erl_docgen/vsn.mk
index 3188b926ff..98d1c3f7be 100644
--- a/lib/erl_docgen/vsn.mk
+++ b/lib/erl_docgen/vsn.mk
@@ -1 +1 @@
-ERL_DOCGEN_VSN = 0.4.2
+ERL_DOCGEN_VSN = 0.5
diff --git a/lib/erl_interface/doc/src/notes.xml b/lib/erl_interface/doc/src/notes.xml
index 9420beaf43..a69c5aac11 100644
--- a/lib/erl_interface/doc/src/notes.xml
+++ b/lib/erl_interface/doc/src/notes.xml
@@ -31,6 +31,48 @@
</header>
<p>This document describes the changes made to the Erl_interface application.</p>
+<section><title>Erl_Interface 3.9</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Fix decoding of LLONG_MIN in erl_decode</p>
+ <p>
+ Own Id: OTP-13666 Aux Id: ERL-158 </p>
+ </item>
+ <item>
+ <p>
+ On windows <c>ei_decode_ulong</c> and
+ <c>ei_decode_long</c> now correctly returns an error when
+ trying to decode a number that does not fit in a long.
+ Fixed a bug on windows where enabling ei tracing would
+ cause a segmentation fault.</p>
+ <p>
+ Own Id: OTP-13673</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Handle terms (pids,ports and refs) from nodes with a
+ 'creation' value larger than 3. This is a preparation of
+ the distribution protocol to allow OTP 19 nodes to
+ correctly communicate with future nodes (20 or higher).
+ The 'creation' value differentiates different
+ incarnations of the same node (name).</p>
+ <p>
+ Own Id: OTP-13488</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Erl_Interface 3.8.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/erl_interface/vsn.mk b/lib/erl_interface/vsn.mk
index 56dbdbac9f..33705d1e8b 100644
--- a/lib/erl_interface/vsn.mk
+++ b/lib/erl_interface/vsn.mk
@@ -1,2 +1,2 @@
-EI_VSN = 3.8.2
+EI_VSN = 3.9
ERL_INTERFACE_VSN = $(EI_VSN)
diff --git a/lib/et/doc/src/notes.xml b/lib/et/doc/src/notes.xml
index ee9e34d14d..5300d2e4ef 100644
--- a/lib/et/doc/src/notes.xml
+++ b/lib/et/doc/src/notes.xml
@@ -37,6 +37,22 @@
one section in this document. The title of each section is the
version number of <c>Event Tracer (ET)</c>.</p>
+<section><title>ET 1.6</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Update selector to utilize new garbage collection trace
+ tags.</p>
+ <p>
+ Own Id: OTP-13545</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>ET 1.5.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/et/vsn.mk b/lib/et/vsn.mk
index 0af7bf75e1..a37fec083b 100644
--- a/lib/et/vsn.mk
+++ b/lib/et/vsn.mk
@@ -1 +1 @@
-ET_VSN = 1.5.1
+ET_VSN = 1.6
diff --git a/lib/eunit/doc/src/notes.xml b/lib/eunit/doc/src/notes.xml
index b513caf95b..88602e8222 100644
--- a/lib/eunit/doc/src/notes.xml
+++ b/lib/eunit/doc/src/notes.xml
@@ -33,6 +33,21 @@
</header>
<p>This document describes the changes made to the EUnit application.</p>
+<section><title>Eunit 2.3</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>There is a new <c>debugVal/2</c> that gives control
+ over the truncation depth.</p>
+ <p>
+ Own Id: OTP-13612</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Eunit 2.2.13</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/eunit/vsn.mk b/lib/eunit/vsn.mk
index dcb7fad699..b551ee6eb6 100644
--- a/lib/eunit/vsn.mk
+++ b/lib/eunit/vsn.mk
@@ -1 +1 @@
-EUNIT_VSN = 2.2.13
+EUNIT_VSN = 2.3
diff --git a/lib/gs/doc/src/notes.xml b/lib/gs/doc/src/notes.xml
index 3ceae98bc5..20188c75e2 100644
--- a/lib/gs/doc/src/notes.xml
+++ b/lib/gs/doc/src/notes.xml
@@ -31,7 +31,22 @@
</header>
<p>This document describes the changes made to the GS application.</p>
- <section><title>GS 1.6</title>
+ <section><title>GS 1.6.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>GS 1.6</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/gs/vsn.mk b/lib/gs/vsn.mk
index 345f0f37f2..c762507bab 100644
--- a/lib/gs/vsn.mk
+++ b/lib/gs/vsn.mk
@@ -1,2 +1,2 @@
-GS_VSN = 1.6
+GS_VSN = 1.6.1
diff --git a/lib/hipe/doc/src/notes.xml b/lib/hipe/doc/src/notes.xml
index 4ebd4b817c..e2a1524be6 100644
--- a/lib/hipe/doc/src/notes.xml
+++ b/lib/hipe/doc/src/notes.xml
@@ -31,6 +31,46 @@
</header>
<p>This document describes the changes made to HiPE.</p>
+<section><title>Hipe 3.15.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ HiPE compiler crashed, during compilation, in some cases
+ that involved inlining of float operations on complicated
+ control flow graphs.</p>
+ <p>
+ Own Id: OTP-13407 Aux Id: PR-984 </p>
+ </item>
+ <item>
+ <p>
+ Various fixes and improvements to the HiPE LLVM backend.
+ <list> <item>Add support for LLVM 3.7 and 3.8 in the
+ HiPE/LLVM x86_64 backend</item> <item>Reinstate support
+ for the LLVM backend on x86 (works OK for LLVM 3.5 to 3.7
+ -- LLVM 3.8 has a bug that prevents it from generating
+ correct native code on x86)</item> </list></p>
+ <p>
+ Own Id: OTP-13626</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Elimination of <c>maps:is_key/2</c> calls to HiPE</p>
+ <p>
+ Own Id: OTP-13625 Aux Id: PR-1069 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Hipe 3.15</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/hipe/vsn.mk b/lib/hipe/vsn.mk
index 2edfd790ed..e61c1a042c 100644
--- a/lib/hipe/vsn.mk
+++ b/lib/hipe/vsn.mk
@@ -1 +1 @@
-HIPE_VSN = 3.15
+HIPE_VSN = 3.15.1
diff --git a/lib/ic/doc/src/notes.xml b/lib/ic/doc/src/notes.xml
index 4b73aa5509..08b02bc4a4 100644
--- a/lib/ic/doc/src/notes.xml
+++ b/lib/ic/doc/src/notes.xml
@@ -31,7 +31,22 @@
<file>notes.xml</file>
</header>
- <section><title>IC 4.4</title>
+ <section><title>IC 4.4.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>IC 4.4</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/ic/vsn.mk b/lib/ic/vsn.mk
index 272c306799..7d00ae0170 100644
--- a/lib/ic/vsn.mk
+++ b/lib/ic/vsn.mk
@@ -1 +1 @@
-IC_VSN = 4.4
+IC_VSN = 4.4.1
diff --git a/lib/inets/doc/src/notes.xml b/lib/inets/doc/src/notes.xml
index ab2cc5ab21..5321203511 100644
--- a/lib/inets/doc/src/notes.xml
+++ b/lib/inets/doc/src/notes.xml
@@ -33,7 +33,59 @@
<file>notes.xml</file>
</header>
- <section><title>Inets 6.2.4</title>
+ <section><title>Inets 6.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Ftp client fixes: 1) Corrected a bug that the ftp client
+ gen_server crashed if the listening data socket was
+ closed.</p>
+ <p>
+ 2) Corrections of ftp client error codes so they are as
+ defined in the reference manual</p>
+ <p>
+ Own Id: OTP-13644</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p> Remove usage of erlang:now(). </p>
+ <p>
+ Own Id: OTP-12441</p>
+ </item>
+ <item>
+ <p> Add handling of DELETE Body to http client. </p>
+ <p>
+ Own Id: OTP-13383 Aux Id: PR-972 </p>
+ </item>
+ <item>
+ <p>
+ Removed references to mod_include and webtool from
+ examples and tests.</p>
+ <p>
+ Own Id: OTP-13445 Aux Id: PR-988 </p>
+ </item>
+ <item>
+ <p>
+ Remove module inets_regexp. Module re should be used
+ instead.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13561</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Inets 6.2.4</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/jinterface/doc/src/notes.xml b/lib/jinterface/doc/src/notes.xml
index c1b7c027ed..3151fc4b5e 100644
--- a/lib/jinterface/doc/src/notes.xml
+++ b/lib/jinterface/doc/src/notes.xml
@@ -31,6 +31,38 @@
</header>
<p>This document describes the changes made to the Jinterface application.</p>
+<section><title>Jinterface 1.7</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Fix Jinterface build on Maven</p>
+ <p>
+ Own Id: OTP-13482</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Handle terms (pids,ports and refs) from nodes with a
+ 'creation' value larger than 3. This is a preparation of
+ the distribution protocol to allow OTP 19 nodes to
+ correctly communicate with future nodes (20 or higher).
+ The 'creation' value differentiates different
+ incarnations of the same node (name).</p>
+ <p>
+ Own Id: OTP-13488</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Jinterface 1.6.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/jinterface/vsn.mk b/lib/jinterface/vsn.mk
index 41e670528a..752b34e78c 100644
--- a/lib/jinterface/vsn.mk
+++ b/lib/jinterface/vsn.mk
@@ -1 +1 @@
-JINTERFACE_VSN = 1.6.1
+JINTERFACE_VSN = 1.7
diff --git a/lib/kernel/doc/src/notes.xml b/lib/kernel/doc/src/notes.xml
index d0540768de..f37433110c 100644
--- a/lib/kernel/doc/src/notes.xml
+++ b/lib/kernel/doc/src/notes.xml
@@ -31,6 +31,203 @@
</header>
<p>This document describes the changes made to the Kernel application.</p>
+<section><title>Kernel 5.0</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>The handling of <c>on_load</c> functions has been
+ improved. The major improvement is that if a code upgrade
+ fails because the <c>on_load</c> function fails, the
+ previous version of the module will now be retained.</p>
+ <p>
+ Own Id: OTP-12593</p>
+ </item>
+ <item>
+ <p><c>rpc:call()</c> and <c>rpc:block_call()</c> would
+ sometimes cause an exception (which was not mentioned in
+ the documentation). This has been corrected so that
+ <c>{badrpc,Reason}</c> will be returned instead.</p>
+ <p>
+ Own Id: OTP-13409</p>
+ </item>
+ <item>
+ <p>On Windows, for modules that were loaded early (such
+ as the <c>lists</c> module), <c>code:which/1</c> would
+ return the path with mixed slashes and backslashes, for
+ example: <c>"C:\\Program
+ Files\\erl8.0/lib/stdlib-2.7/ebin/lists.beam"</c>. This
+ has been corrected.</p>
+ <p>
+ Own Id: OTP-13410</p>
+ </item>
+ <item>
+ <p>
+ Make file:datasync use fsync instead of fdatasync on Mac
+ OSX.</p>
+ <p>
+ Own Id: OTP-13411</p>
+ </item>
+ <item>
+ <p>
+ The default chunk size for the fallback sendfile
+ implementation, used on platforms that do not have a
+ native sendfile, has been decreased in order to reduce
+ connectivity issues.</p>
+ <p>
+ Own Id: OTP-13444</p>
+ </item>
+ <item>
+ <p>
+ Large file writes (2Gb or more) could fail on some Unix
+ platforms (for example, OS X and FreeBSD).</p>
+ <p>
+ Own Id: OTP-13461</p>
+ </item>
+ <item>
+ <p>
+ A bug has been fixed where the DNS resolver inet_res did
+ not refresh its view of the contents of for example
+ resolv.conf immediately after start and hence then failed
+ name resolution. Reported and fix suggested by Michal
+ Ptaszek in GitHUB pull req #949.</p>
+ <p>
+ Own Id: OTP-13470 Aux Id: Pull #969 </p>
+ </item>
+ <item>
+ <p>
+ Fix process leak from global_group.</p>
+ <p>
+ Own Id: OTP-13516 Aux Id: PR-1008 </p>
+ </item>
+ <item>
+ <p>
+ The function <c>inet:gethostbyname/1</c> now honors the
+ resolver option <c>inet6</c> instead of always looking up
+ IPv4 addresses.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13622 Aux Id: PR-1065 </p>
+ </item>
+ <item>
+ <p>
+ The <c>Status</c> argument to <c>init:stop/1</c> is now
+ sanity checked to make sure <c>erlang:halt</c> does not
+ fail.</p>
+ <p>
+ Own Id: OTP-13631 Aux Id: PR-911 </p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Add {line_delim, byte()} option to inet:setopts/2 and
+ decode_packet/3</p>
+ <p>
+ Own Id: OTP-12837</p>
+ </item>
+ <item>
+ <p>
+ Added <seealso
+ marker="kernel:os#perf_counter/1">os:perf_counter/1</seealso>.</p>
+ <p>
+ The perf_counter is a very very cheap and high resolution
+ timer that can be used to timestamp system events. It
+ does not have monoticity guarantees, but should on most
+ OS's expose a monotonous time.</p>
+ <p>
+ Own Id: OTP-12908</p>
+ </item>
+ <item>
+ <p>
+ The os:cmd call has been optimized on unix platforms to
+ be scale better with the number of schedulers.</p>
+ <p>
+ Own Id: OTP-13089</p>
+ </item>
+ <item>
+ <p>New functions that can load multiple modules at once
+ have been added to the '<c>code</c>' module. The
+ functions are <c>code:atomic_load/1</c>,
+ <c>code:prepare_loading/1</c>,
+ <c>code:finish_loading/1</c>, and
+ <c>code:ensure_modules_loaded/1</c>.</p>
+ <p>
+ Own Id: OTP-13111</p>
+ </item>
+ <item>
+ <p>
+ The code path cache feature turned out not to be very
+ useful in practice and has been removed. If an attempt is
+ made to enable the code path cache, there will be a
+ warning report informing the user that the feature has
+ been removed.</p>
+ <p>
+ Own Id: OTP-13191</p>
+ </item>
+ <item>
+ <p>When an attempt is made to start a distributed Erlang
+ node with the same name as an existing node, the error
+ message will be much shorter and easier to read than
+ before. Example:</p>
+ <p><c>Protocol 'inet_tcp': the name somename@somehost
+ seems to be in use by another Erlang node</c></p>
+ <p>
+ Own Id: OTP-13294</p>
+ </item>
+ <item>
+ <p>
+ The output of the default error logger is somewhat
+ prettier and easier to read. The default error logger is
+ used during start-up of the OTP system. If the start-up
+ fails, the output will be easier to read.</p>
+ <p>
+ Own Id: OTP-13325</p>
+ </item>
+ <item>
+ <p>The functions <c>rpc:safe_multi_server_call/2,3</c>
+ that were deprecated in R12B have been removed.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13449</p>
+ </item>
+ <item>
+ <p>
+ Update the error reasons in dist_util, and show them in
+ the logs if net_kernel:verbose(1) has been called.</p>
+ <p>
+ Own Id: OTP-13458</p>
+ </item>
+ <item>
+ <p>
+ Experimental support for Unix Domain Sockets has been
+ implemented. Read the sources if you want to try it out.
+ Example: <c>gen_udp:open(0,
+ [{ifaddr,{local,"/tmp/socket"}}])</c>. Documentation will
+ be written after user feedback on the experimental API.</p>
+ <p>
+ Own Id: OTP-13572 Aux Id: PR-612 </p>
+ </item>
+ <item>
+ <p>
+ Allow heart to be configured to not kill the previous
+ emulator before calling the HEART_COMMAND. This is done
+ by setting the environment variable HEART_NO_KILL to
+ TRUE.</p>
+ <p>
+ Own Id: OTP-13650</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Kernel 4.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/kernel/test/gen_tcp_api_SUITE.erl b/lib/kernel/test/gen_tcp_api_SUITE.erl
index 026cbf8b28..77ec89b4f4 100644
--- a/lib/kernel/test/gen_tcp_api_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_api_SUITE.erl
@@ -308,9 +308,7 @@ t_implicit_inet6(Host, Addr) ->
implicit_inet6(S1, Loopback),
ok = gen_tcp:close(S1),
%%
- Localhost = "localhost",
- Localaddr = ok(inet:getaddr(Localhost, inet6)),
- io:format("~s ~p~n", [Localhost,Localaddr]),
+ Localaddr = ok(get_localaddr()),
S2 = ok(gen_tcp:listen(0, [{ip,Localaddr}])),
implicit_inet6(S2, Localaddr),
ok = gen_tcp:close(S2),
@@ -593,6 +591,20 @@ ok(NotOk) ->
error, {Thrown, NotOk}, tl(erlang:get_stacktrace()))
end.
+get_localaddr() ->
+ get_localaddr(["localhost", "localhost6", "ip6-localhost"]).
+
+get_localaddr([]) ->
+ {error, localaddr_not_found};
+get_localaddr([Localhost|Ls]) ->
+ case inet:getaddr(Localhost, inet6) of
+ {ok, LocalAddr} ->
+ io:format("~s ~p~n", [Localhost, LocalAddr]),
+ {ok, LocalAddr};
+ _ ->
+ get_localaddr(Ls)
+ end.
+
getsockfd() -> undefined.
closesockfd(_FD) -> undefined.
diff --git a/lib/kernel/test/gen_udp_SUITE.erl b/lib/kernel/test/gen_udp_SUITE.erl
index db4e174374..1029d7ef0a 100644
--- a/lib/kernel/test/gen_udp_SUITE.erl
+++ b/lib/kernel/test/gen_udp_SUITE.erl
@@ -724,9 +724,7 @@ implicit_inet6(Host, Addr) ->
implicit_inet6(S1, Active, Loopback),
ok = gen_udp:close(S1),
%%
- Localhost = "localhost",
- Localaddr = ok(inet:getaddr(Localhost, inet6)),
- io:format("~s ~p~n", [Localhost,Localaddr]),
+ Localaddr = ok(get_localaddr()),
S2 = ok(gen_udp:open(0, [{ip,Localaddr},Active])),
implicit_inet6(S2, Active, Localaddr),
ok = gen_udp:close(S2),
@@ -778,3 +776,17 @@ delete_local_filenames() ->
filelib:wildcard(
"/tmp/" ?MODULE_STRING "_" ++ os:getpid() ++ "_*")],
ok.
+
+get_localaddr() ->
+ get_localaddr(["localhost", "localhost6", "ip6-localhost"]).
+
+get_localaddr([]) ->
+ {error, localaddr_not_found};
+get_localaddr([Localhost|Ls]) ->
+ case inet:getaddr(Localhost, inet6) of
+ {ok, LocalAddr} ->
+ io:format("~s ~p~n", [Localhost, LocalAddr]),
+ {ok, LocalAddr};
+ _ ->
+ get_localaddr(Ls)
+ end.
diff --git a/lib/kernel/test/init_SUITE.erl b/lib/kernel/test/init_SUITE.erl
index a332e7966b..1370e23195 100644
--- a/lib/kernel/test/init_SUITE.erl
+++ b/lib/kernel/test/init_SUITE.erl
@@ -298,7 +298,7 @@ many_restarts() ->
many_restarts(Config) when is_list(Config) ->
{ok, Node} = loose_node:start(init_test, "", ?DEFAULT_TIMEOUT_SEC),
- loop_restart(30,Node,rpc:call(Node,erlang,whereis,[error_logger])),
+ loop_restart(50,Node,rpc:call(Node,erlang,whereis,[error_logger])),
loose_node:stop(Node),
ok.
diff --git a/lib/megaco/doc/src/notes.xml b/lib/megaco/doc/src/notes.xml
index 7deafc79e9..a05a339003 100644
--- a/lib/megaco/doc/src/notes.xml
+++ b/lib/megaco/doc/src/notes.xml
@@ -37,7 +37,22 @@
section is the version number of Megaco.</p>
- <section><title>Megaco 3.18</title>
+ <section><title>Megaco 3.18.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Megaco 3.18</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/megaco/vsn.mk b/lib/megaco/vsn.mk
index 2e850f2917..b95cd66a81 100644
--- a/lib/megaco/vsn.mk
+++ b/lib/megaco/vsn.mk
@@ -19,6 +19,6 @@
# %CopyrightEnd%
APPLICATION = megaco
-MEGACO_VSN = 3.18
+MEGACO_VSN = 3.18.1
PRE_VSN =
APP_VSN = "$(APPLICATION)-$(MEGACO_VSN)$(PRE_VSN)"
diff --git a/lib/mnesia/doc/src/notes.xml b/lib/mnesia/doc/src/notes.xml
index 4a68e76d50..7d8e8d0c44 100644
--- a/lib/mnesia/doc/src/notes.xml
+++ b/lib/mnesia/doc/src/notes.xml
@@ -39,7 +39,28 @@
thus constitutes one section in this document. The title of each
section is the version number of Mnesia.</p>
- <section><title>Mnesia 4.13.4</title>
+ <section><title>Mnesia 4.14</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Added experimental external backend plugin api. This adds
+ the possibility for the user to write other storage
+ backends for data, for example by using shared memory or
+ ram-cached disk storage.</p>
+ <p>
+ The plugin api may change in future versions after being
+ battle tested.</p>
+ <p>
+ Own Id: OTP-13058</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Mnesia 4.13.4</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
diff --git a/lib/mnesia/vsn.mk b/lib/mnesia/vsn.mk
index 194bc439a0..fb4200f62d 100644
--- a/lib/mnesia/vsn.mk
+++ b/lib/mnesia/vsn.mk
@@ -1 +1 @@
-MNESIA_VSN = 4.13.4
+MNESIA_VSN = 4.14
diff --git a/lib/observer/doc/src/notes.xml b/lib/observer/doc/src/notes.xml
index c3bd0d33b9..505d0dcc89 100644
--- a/lib/observer/doc/src/notes.xml
+++ b/lib/observer/doc/src/notes.xml
@@ -32,6 +32,51 @@
<p>This document describes the changes made to the Observer
application.</p>
+<section><title>Observer 2.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Update observer GUI to support tracing on ports, and to
+ set matchspecs for send/receive. This required some minor
+ bugfixes in runtime_tools/dbg.</p>
+ <p>
+ Own Id: OTP-13481</p>
+ </item>
+ <item>
+ <p>
+ Update dbg and ttb to work with a tracer module as tracer
+ and tracing on ports.</p>
+ <p>
+ Own Id: OTP-13500</p>
+ </item>
+ <item>
+ <p>
+ Added possibility to change update frequency and length
+ of the graph windows.</p>
+ <p>
+ Own Id: OTP-13555</p>
+ </item>
+ <item>
+ <p>
+ Improved background coloring to work with dark themes and
+ other visual improvements.</p>
+ <p>
+ Own Id: OTP-13556</p>
+ </item>
+ <item>
+ <p>
+ Crashdump viewer now allows port info "Port controls
+ forker process..."</p>
+ <p>
+ Own Id: OTP-13647</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Observer 2.1.2</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/observer/vsn.mk b/lib/observer/vsn.mk
index aede0858d6..f214810199 100644
--- a/lib/observer/vsn.mk
+++ b/lib/observer/vsn.mk
@@ -1 +1 @@
-OBSERVER_VSN = 2.1.2
+OBSERVER_VSN = 2.2
diff --git a/lib/odbc/doc/src/notes.xml b/lib/odbc/doc/src/notes.xml
index ac3c99badc..d3dd39616f 100644
--- a/lib/odbc/doc/src/notes.xml
+++ b/lib/odbc/doc/src/notes.xml
@@ -32,7 +32,23 @@
<p>This document describes the changes made to the odbc application.
</p>
- <section><title>ODBC 2.11.1</title>
+ <section><title>ODBC 2.11.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Configure enhancement for better handling program paths
+ used in the build process</p>
+ <p>
+ Own Id: OTP-13559</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>ODBC 2.11.1</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/odbc/vsn.mk b/lib/odbc/vsn.mk
index c7c84560d1..957c6b42eb 100644
--- a/lib/odbc/vsn.mk
+++ b/lib/odbc/vsn.mk
@@ -1 +1 @@
-ODBC_VSN = 2.11.1
+ODBC_VSN = 2.11.2
diff --git a/lib/orber/doc/src/notes.xml b/lib/orber/doc/src/notes.xml
index 74d9d7a98c..89f258e5e9 100644
--- a/lib/orber/doc/src/notes.xml
+++ b/lib/orber/doc/src/notes.xml
@@ -34,7 +34,22 @@
</header>
- <section><title>Orber 3.8.1</title>
+ <section><title>Orber 3.8.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Orber 3.8.1</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/orber/vsn.mk b/lib/orber/vsn.mk
index 4947315ad0..dcb2c985a3 100644
--- a/lib/orber/vsn.mk
+++ b/lib/orber/vsn.mk
@@ -1 +1 @@
-ORBER_VSN = 3.8.1
+ORBER_VSN = 3.8.2
diff --git a/lib/os_mon/doc/src/notes.xml b/lib/os_mon/doc/src/notes.xml
index c565df7f3b..e6e80b046d 100644
--- a/lib/os_mon/doc/src/notes.xml
+++ b/lib/os_mon/doc/src/notes.xml
@@ -31,6 +31,40 @@
</header>
<p>This document describes the changes made to the OS_Mon application.</p>
+<section><title>Os_Mon 2.4.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Fix type specification for cpu_sup:util/1</p>
+ <p>
+ Own Id: OTP-13526 Aux Id: PR-1029 </p>
+ </item>
+ <item>
+ <p>
+ Fix strict compilation on SUN/SPARC</p>
+ <p>
+ Own Id: OTP-13548 Aux Id: PR-1046 </p>
+ </item>
+ <item>
+ <p>
+ Implement cpu_sup:util/0,1 on Mac OSX</p>
+ <p>
+ Own Id: OTP-13597 Aux Id: PR-1049 </p>
+ </item>
+ <item>
+ <p>
+ Fix memsup:get_os_wordsize() on 64-bit FreeBSD and 64-bit
+ Linux PPC</p>
+ <p>
+ Own Id: OTP-13601 Aux Id: PR-1039 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Os_Mon 2.4</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/os_mon/vsn.mk b/lib/os_mon/vsn.mk
index 7f2667e40a..1ac0fb1d27 100644
--- a/lib/os_mon/vsn.mk
+++ b/lib/os_mon/vsn.mk
@@ -1 +1 @@
-OS_MON_VSN = 2.4
+OS_MON_VSN = 2.4.1
diff --git a/lib/otp_mibs/doc/src/notes.xml b/lib/otp_mibs/doc/src/notes.xml
index 7beac5ffcb..dbd2f47ffb 100644
--- a/lib/otp_mibs/doc/src/notes.xml
+++ b/lib/otp_mibs/doc/src/notes.xml
@@ -32,6 +32,21 @@
<p>This document describes the changes made to the OTP_Mibs
application.</p>
+<section><title>Otp_Mibs 1.1.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Otp_Mibs 1.1</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/otp_mibs/vsn.mk b/lib/otp_mibs/vsn.mk
index 38436d363e..7a793007ee 100644
--- a/lib/otp_mibs/vsn.mk
+++ b/lib/otp_mibs/vsn.mk
@@ -1,4 +1,4 @@
-OTP_MIBS_VSN = 1.1
+OTP_MIBS_VSN = 1.1.1
# Note: The branch 'otp_mibs' is defunct as of otp_mibs-1.0.4 and
# should NOT be used again.
diff --git a/lib/parsetools/doc/src/notes.xml b/lib/parsetools/doc/src/notes.xml
index 06d66e28c3..b826b4d03a 100644
--- a/lib/parsetools/doc/src/notes.xml
+++ b/lib/parsetools/doc/src/notes.xml
@@ -31,6 +31,21 @@
</header>
<p>This document describes the changes made to the Parsetools application.</p>
+<section><title>Parsetools 2.1.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Parsetools 2.1.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/parsetools/vsn.mk b/lib/parsetools/vsn.mk
index de3da23c8a..befdd82d6e 100644
--- a/lib/parsetools/vsn.mk
+++ b/lib/parsetools/vsn.mk
@@ -1 +1 @@
-PARSETOOLS_VSN = 2.1.1
+PARSETOOLS_VSN = 2.1.2
diff --git a/lib/percept/doc/src/notes.xml b/lib/percept/doc/src/notes.xml
index 750dcb6cf5..c9d5d3ae29 100644
--- a/lib/percept/doc/src/notes.xml
+++ b/lib/percept/doc/src/notes.xml
@@ -33,6 +33,35 @@
</header>
<p>This document describes the changes made to the Percept application.</p>
+<section><title>Percept 0.9</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Remove deprecated <c>erlang:now/0</c> calls</p>
+ <p>
+ Own Id: OTP-13422</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Improve line implementation</p>
+ <p>
+ Add capabilities for line thickness and anti-aliasing.</p>
+ <p>
+ Own Id: OTP-13598</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Percept 0.8.11</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/percept/vsn.mk b/lib/percept/vsn.mk
index 833ab35aa5..614cee8645 100644
--- a/lib/percept/vsn.mk
+++ b/lib/percept/vsn.mk
@@ -1 +1 @@
-PERCEPT_VSN = 0.8.11
+PERCEPT_VSN = 0.9
diff --git a/lib/public_key/doc/src/notes.xml b/lib/public_key/doc/src/notes.xml
index 49b2ba0326..c4d930c01f 100644
--- a/lib/public_key/doc/src/notes.xml
+++ b/lib/public_key/doc/src/notes.xml
@@ -35,6 +35,34 @@
<file>notes.xml</file>
</header>
+<section><title>Public_Key 1.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The ASN-1 type GeneralName can have more values, then the
+ most common directory name, the code now handles this.</p>
+ <p>
+ Own Id: OTP-13554</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Handle PEM encoded EC public keys</p>
+ <p>
+ Own Id: OTP-13408</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Public_Key 1.1.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/public_key/vsn.mk b/lib/public_key/vsn.mk
index f801f55073..84f6a659b5 100644
--- a/lib/public_key/vsn.mk
+++ b/lib/public_key/vsn.mk
@@ -1 +1 @@
-PUBLIC_KEY_VSN = 1.1.1
+PUBLIC_KEY_VSN = 1.2
diff --git a/lib/reltool/doc/src/notes.xml b/lib/reltool/doc/src/notes.xml
index 0a83954865..6df4924d0a 100644
--- a/lib/reltool/doc/src/notes.xml
+++ b/lib/reltool/doc/src/notes.xml
@@ -38,7 +38,24 @@
thus constitutes one section in this document. The title of each
section is the version number of Reltool.</p>
- <section><title>Reltool 0.7</title>
+ <section><title>Reltool 0.7.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p> Modify the code as motivated by a change of the
+ Erlang Parser (<c>undefined</c> is no longer
+ automatically inserted to the type of record fields
+ without an initializer). </p>
+ <p>
+ Own Id: OTP-13033 Aux Id: OTP-12719 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Reltool 0.7</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/reltool/vsn.mk b/lib/reltool/vsn.mk
index 733c41bc02..76f69fd294 100644
--- a/lib/reltool/vsn.mk
+++ b/lib/reltool/vsn.mk
@@ -1 +1 @@
-RELTOOL_VSN = 0.7
+RELTOOL_VSN = 0.7.1
diff --git a/lib/runtime_tools/doc/src/notes.xml b/lib/runtime_tools/doc/src/notes.xml
index 57241edbdc..6bec7cb9ca 100644
--- a/lib/runtime_tools/doc/src/notes.xml
+++ b/lib/runtime_tools/doc/src/notes.xml
@@ -32,6 +32,100 @@
<p>This document describes the changes made to the Runtime_Tools
application.</p>
+<section><title>Runtime_Tools 1.10</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Fix bug in dbg:trace_port/2 that could cause the trace ip
+ driver to produce faulty error reports "...(re)selected
+ before stop_select was called for driver trace_ip_drv".</p>
+ <p>
+ Own Id: OTP-13576 Aux Id: ERL-119 </p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Add microstate accounting</p>
+ <p>
+ Microstate accounting is a way to track which state the
+ different threads within ERTS are in. The main usage area
+ is to pin point performance bottlenecks by checking which
+ states the threads are in and then from there figuring
+ out why and where to optimize.</p>
+ <p>
+ Since checking whether microstate accounting is on or off
+ is relatively expensive only a few of the states are
+ enabled by default and more states can be enabled through
+ configure.</p>
+ <p>
+ There is a convenience module called msacc that has been
+ added to runtime_tools that can assist in gathering and
+ interpreting the data from Microstate accounting.</p>
+ <p>
+ For more information see <seealso
+ marker="erts:erlang#statistics_microstate_accounting">erlang:statistics(microstate_accounting,
+ _)</seealso> and the <seealso
+ marker="runtime_tools:msacc">msacc</seealso> module in
+ runtime_tools.</p>
+ <p>
+ Own Id: OTP-12345</p>
+ </item>
+ <item>
+ <p>
+ Update observer GUI to support tracing on ports, and to
+ set matchspecs for send/receive. This required some minor
+ bugfixes in runtime_tools/dbg.</p>
+ <p>
+ Own Id: OTP-13481</p>
+ </item>
+ <item>
+ <p>
+ Update dbg and ttb to work with a tracer module as tracer
+ and tracing on ports.</p>
+ <p>
+ Own Id: OTP-13500</p>
+ </item>
+ <item>
+ <p>
+ Updated dbg to accept the new trace options
+ <c>monotonic_timestamp</c> and
+ <c>strict_monotonic_timestamp</c>.</p>
+ <p>
+ Own Id: OTP-13502</p>
+ </item>
+ <item>
+ <p>
+ Introduce LTTng tracing via Erlang tracing.</p>
+ <p>
+ For LTTng to be enabled OTP needs to be built with
+ configure option <c>--with-dynamic-trace=lttng</c>.</p>
+ <p>The dynamic trace module <c>dyntrace</c> is now
+ capable to be used as a LTTng sink for Erlang tracing.
+ For a list of all tracepoints, see <seealso
+ marker="runtime_tools:LTTng">Runtime Tools User's
+ Guide</seealso> .</p>
+ <p>This feature also introduces an incompatible change in
+ trace tags. The trace tags <c>gc_start</c> and
+ <c>gc_end</c> has been split into <c>gc_minor_start</c>,
+ <c>gc_minor_end</c> and <c>gc_major_start</c>,
+ <c>gc_major_end</c>.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13532</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Runtime_Tools 1.9.3</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/runtime_tools/vsn.mk b/lib/runtime_tools/vsn.mk
index bfc8b84b91..b33f6f4721 100644
--- a/lib/runtime_tools/vsn.mk
+++ b/lib/runtime_tools/vsn.mk
@@ -1 +1 @@
-RUNTIME_TOOLS_VSN = 1.9.3
+RUNTIME_TOOLS_VSN = 1.10
diff --git a/lib/sasl/doc/src/notes.xml b/lib/sasl/doc/src/notes.xml
index f07938220c..dae73f8b23 100644
--- a/lib/sasl/doc/src/notes.xml
+++ b/lib/sasl/doc/src/notes.xml
@@ -31,6 +31,23 @@
</header>
<p>This document describes the changes made to the SASL application.</p>
+<section><title>SASL 3.0</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ The module 'overload' is removed.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13184</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>SASL 2.7</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/sasl/test/release_handler_SUITE.erl b/lib/sasl/test/release_handler_SUITE.erl
index 8134e02221..ad58bb6b7b 100644
--- a/lib/sasl/test/release_handler_SUITE.erl
+++ b/lib/sasl/test/release_handler_SUITE.erl
@@ -1103,6 +1103,7 @@ otp_9395_update_many_mods(Conf) when is_list(Conf) ->
[RelVsn2, filename:join(Rel2Dir, "sys.config")]),
%% First, install release directly and check how much time it takes
+ rpc:call(Node,erlang,garbage_collect,[]),
rpc:call(Node,erlang,system_flag,[scheduler_wall_time,true]),
{TInst0,{ok, _, []}} =
timer:tc(rpc,call,[Node, release_handler, install_release, [RelVsn2]]),
@@ -1129,6 +1130,7 @@ otp_9395_update_many_mods(Conf) when is_list(Conf) ->
%% Finally install release after check and purge, and check that
%% this install was faster than the first.
rpc:call(Node,erlang,system_flag,[scheduler_wall_time,false]),
+ rpc:call(Node,erlang,garbage_collect,[]),
rpc:call(Node,erlang,system_flag,[scheduler_wall_time,true]),
{TInst2,{ok, _RelVsn1, []}} =
timer:tc(rpc,call,[Node, release_handler, install_release, [RelVsn2]]),
@@ -1200,6 +1202,7 @@ otp_9395_rm_many_mods(Conf) when is_list(Conf) ->
[RelVsn2, filename:join(Rel2Dir, "sys.config")]),
%% First, install release directly and check how much time it takes
+ rpc:call(Node,erlang,garbage_collect,[]),
rpc:call(Node,erlang,system_flag,[scheduler_wall_time,true]),
{TInst0,{ok, _, []}} =
timer:tc(rpc,call,[Node, release_handler, install_release, [RelVsn2]]),
@@ -1226,6 +1229,7 @@ otp_9395_rm_many_mods(Conf) when is_list(Conf) ->
%% Finally install release after check and purge, and check that
%% this install was faster than the first.
rpc:call(Node,erlang,system_flag,[scheduler_wall_time,false]),
+ rpc:call(Node,erlang,garbage_collect,[]),
rpc:call(Node,erlang,system_flag,[scheduler_wall_time,true]),
{TInst2,{ok, _RelVsn1, []}} =
timer:tc(rpc,call,[Node, release_handler, install_release, [RelVsn2]]),
@@ -1761,8 +1765,6 @@ upgrade_gg(Conf) ->
Nodes1 = [Gg1,Gg3,Gg4,Gg5] =
start_nodes(Conf,[Gg1Sname,Gg3Sname,Gg4Sname,Gg5Sname],"upgrade_gg"),
- %% Give some time to synch nodes, then check global group info.
- timer:sleep(1000),
[check_gg_info(Node,Nodes1,[],Nodes1--[Node]) || Node <- Nodes1],
%% register a process on each of the nodes
@@ -2449,37 +2451,27 @@ write_term_file(File,Term) ->
ok = file:write_file(File,io_lib:format("~p.~n",[Term])).
-%% Check that global group info is correct
+%% Check that global group info is correct - try again for a maximum of 5 sec
check_gg_info(Node,OtherAlive,OtherDead,Synced) ->
+ check_gg_info(Node,OtherAlive,OtherDead,Synced,5).
+
+check_gg_info(Node,OtherAlive,OtherDead,Synced,N) ->
GGI = rpc:call(Node, global_group, info, []),
GI = rpc:call(Node, global, info,[]),
try do_check_gg_info(OtherAlive,OtherDead,Synced,GGI,GI)
- catch _:E ->
- ?t:format("~ncheck_gg_info failed for ~p: ~p~nwhen GGI was: ~p~n"
- "and GI was: ~p~n",
- [Node,E,GGI,GI]),
- %% An attempt to find out if it is only a timing issue
- %% that makes this fail every now and then:
- try_again_check(Node,GGI,GI,1),
- ?t:fail("check_gg_info failed")
- end.
-
-try_again_check(_Node,_GGI,_GI,6) ->
- ok;
-try_again_check(Node,GGI,GI,N) ->
- timer:sleep(1000),
- case {rpc:call(Node,global_group,info,[]),
- rpc:call(Node,global,info,[])} of
- {GGI,GI} ->
- ?t:format("~nAfter one more sek, GGI and GI are still the same"),
- try_again_check(Node,GGI,GI,N+1);
- {NewGGI,NewGI} ->
- ?t:format("~nAfter one more sek:~nNew GGI: ~p~nNew GI: ~p~n",
- [NewGGI,NewGI]),
- try_again_check(Node,NewGGI,NewGI,N+1)
+ catch _:E when N==0 ->
+ ?t:format("~nERROR: check_gg_info failed for ~p:~n~p~n"
+ "when GGI was: ~p~nand GI was: ~p~n",
+ [Node,{E,erlang:get_stacktrace()},GGI,GI]),
+ ?t:fail("check_gg_info failed");
+ _:E ->
+ ?t:format("~nWARNING: check_gg_info failed for ~p:~n~p~n"
+ "when GGI was: ~p~nand GI was: ~p~n",
+ [Node,{E,erlang:get_stacktrace()},GGI,GI]),
+ timer:sleep(1000),
+ check_gg_info(Node,OtherAlive,OtherDead,Synced,N-1)
end.
-
do_check_gg_info(OtherAlive,OtherDead,Synced,GGI,GI) ->
{_,gg1} = lists:keyfind(own_group_name,1,GGI),
{_,synced} = lists:keyfind(state,1,GGI),
diff --git a/lib/snmp/doc/src/notes.xml b/lib/snmp/doc/src/notes.xml
index b9dc5e4117..0f5c35b300 100644
--- a/lib/snmp/doc/src/notes.xml
+++ b/lib/snmp/doc/src/notes.xml
@@ -34,7 +34,22 @@
</header>
- <section><title>SNMP 5.2.2</title>
+ <section><title>SNMP 5.2.3</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>SNMP 5.2.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
diff --git a/lib/snmp/vsn.mk b/lib/snmp/vsn.mk
index f58f6b6162..f95b428290 100644
--- a/lib/snmp/vsn.mk
+++ b/lib/snmp/vsn.mk
@@ -19,6 +19,6 @@
# %CopyrightEnd%
APPLICATION = snmp
-SNMP_VSN = 5.2.2
+SNMP_VSN = 5.2.3
PRE_VSN =
APP_VSN = "$(APPLICATION)-$(SNMP_VSN)$(PRE_VSN)"
diff --git a/lib/ssh/doc/src/notes.xml b/lib/ssh/doc/src/notes.xml
index 96bc50c689..7ef41b6828 100644
--- a/lib/ssh/doc/src/notes.xml
+++ b/lib/ssh/doc/src/notes.xml
@@ -30,6 +30,100 @@
<file>notes.xml</file>
</header>
+<section><title>Ssh 4.3</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ A socket created and connected by gen_tcp could now be
+ used as input to ssh:connect, ssh:shell,
+ ssh_sftp:start_channel and ssh:daemon.</p>
+ <p>
+ Own Id: OTP-12860</p>
+ </item>
+ <item>
+ <p>
+ Some time optimization mainly in message encoding.</p>
+ <p>
+ Own Id: OTP-13131</p>
+ </item>
+ <item>
+ <p>
+ Optimized the sftp client time by setting new packet and
+ window sizes.</p>
+ <p>
+ Own Id: OTP-13175</p>
+ </item>
+ <item>
+ <p>
+ The <c>ssh_connection_handler</c> module in SSH is
+ changed and now uses the new behaviour <c>gen_statem</c>. </p>
+ <p>
+ The module can be used as an example of a
+ <c>gen_statem</c> callback module but with a warning:
+ This commit of ssh is just a straightforward port from
+ gen_fsm to gen_statem with some code cleaning. Since the
+ state machine and the state callbacks are almost
+ unchanged the ssh module does not demonstrate the full
+ potential of the new behaviour.</p>
+ <p>
+ The "new" state machine uses compound states. The ssh
+ server and client state machines are quite similar but
+ differences exist. With <c>gen_fsm</c> there were flags
+ in the user data which in fact implemented "substates".
+ Now with <c>gen_statem</c> those are made explicit in the
+ state names, eg. the state <c>userauth</c> and the binary
+ <c>role</c>-flag becomes the two state names
+ <c>{userauth, server}</c> and <c>{userauth, client}</c>.</p>
+ <p>
+ Own Id: OTP-13267</p>
+ </item>
+ <item>
+ <p>
+ The <c>{error, Reason}</c> tuples returned from
+ <c>ssh_sftp</c> api functions are described.</p>
+ <p>
+ Own Id: OTP-13347 Aux Id: ERL-86 </p>
+ </item>
+ <item>
+ <p>
+ Added -spec in ssh</p>
+ <p>
+ Own Id: OTP-13479</p>
+ </item>
+ <item>
+ <p>
+ It is now possible to call <c>ssh:daemon/{1,2,3}</c> with
+ <c>Port=0</c>. This makes the daemon select a free
+ listening tcp port before opening it. To find this port
+ number after the call, use the new function
+ <c>ssh:daemon_info/1</c>. See the reference manual for
+ details.</p>
+ <p>
+ Own Id: OTP-13527</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Ssh 4.2.2.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ SSH client does not any longer retry a bad password given
+ as option to ssh:connect et al.</p>
+ <p>
+ Own Id: OTP-13674 Aux Id: TR-HU92273 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Ssh 4.2.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/ssh/src/ssh_auth.erl b/lib/ssh/src/ssh_auth.erl
index 49eec8072f..fb5e086656 100644
--- a/lib/ssh/src/ssh_auth.erl
+++ b/lib/ssh/src/ssh_auth.erl
@@ -31,12 +31,111 @@
-export([publickey_msg/1, password_msg/1, keyboard_interactive_msg/1,
service_request_msg/1, init_userauth_request_msg/1,
userauth_request_msg/1, handle_userauth_request/3,
- handle_userauth_info_request/3, handle_userauth_info_response/2
+ handle_userauth_info_request/2, handle_userauth_info_response/2
]).
%%--------------------------------------------------------------------
%%% Internal application API
%%--------------------------------------------------------------------
+%%%----------------------------------------------------------------
+userauth_request_msg(#ssh{userauth_methods = ServerMethods,
+ userauth_supported_methods = UserPrefMethods, % Note: this is not documented as supported for clients
+ userauth_preference = ClientMethods0
+ } = Ssh0) ->
+ case sort_select_mthds(ClientMethods0, UserPrefMethods, ServerMethods) of
+ [] ->
+ Msg = #ssh_msg_disconnect{code = ?SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE,
+ description = "Unable to connect using the available authentication methods",
+ language = "en"},
+ {disconnect, Msg, ssh_transport:ssh_packet(Msg, Ssh0)};
+
+ [{Pref,Module,Function,Args} | Prefs] ->
+ Ssh = case Pref of
+ "keyboard-interactive" -> Ssh0;
+ _ -> Ssh0#ssh{userauth_preference = Prefs}
+ end,
+ case Module:Function(Args ++ [Ssh]) of
+ {not_ok, Ssh1} ->
+ userauth_request_msg(Ssh1#ssh{userauth_preference = Prefs});
+ Result ->
+ {Pref,Result}
+ end
+ end.
+
+
+
+sort_select_mthds(Clients, undefined, Servers) ->
+ %% User has not expressed an opinion via option "auth_methods", use the server's prefs
+ sort_select_mthds1(Clients, Servers, string:tokens(?SUPPORTED_AUTH_METHODS,","));
+
+sort_select_mthds(Clients, Users0, Servers0) ->
+ %% The User has an opinion, use the intersection of that and the Servers whishes but
+ %% in the Users order
+ sort_select_mthds1(Clients, string:tokens(Users0,","), Servers0).
+
+
+sort_select_mthds1(Clients, Users0, Servers0) ->
+ Servers = unique(Servers0),
+ Users = unique(Users0),
+ [C || Key <- Users,
+ lists:member(Key, Servers),
+ C <- Clients,
+ element(1,C) == Key].
+
+unique(L) ->
+ lists:reverse(
+ lists:foldl(fun(E,Acc) ->
+ case lists:member(E,Acc) of
+ true -> Acc;
+ false -> [E|Acc]
+ end
+ end, [], L)).
+
+
+%%%---- userauth_request_msg "callbacks"
+password_msg([#ssh{opts = Opts, io_cb = IoCb,
+ user = User, service = Service} = Ssh0]) ->
+ {Password,Ssh} =
+ case proplists:get_value(password, Opts) of
+ undefined when IoCb == ssh_no_io ->
+ {not_ok, Ssh0};
+ undefined ->
+ {IoCb:read_password("ssh password: ",Ssh0), Ssh0};
+ PW ->
+ %% If "password" option is given it should not be tried again
+ {PW, Ssh0#ssh{opts = lists:keyreplace(password,1,Opts,{password,not_ok})}}
+ end,
+ case Password of
+ not_ok ->
+ {not_ok, Ssh};
+ _ ->
+ ssh_transport:ssh_packet(
+ #ssh_msg_userauth_request{user = User,
+ service = Service,
+ method = "password",
+ data =
+ <<?BOOLEAN(?FALSE),
+ ?STRING(unicode:characters_to_binary(Password))>>},
+ Ssh)
+ end.
+
+%% See RFC 4256 for info on keyboard-interactive
+keyboard_interactive_msg([#ssh{user = User,
+ opts = Opts,
+ service = Service} = Ssh]) ->
+ case proplists:get_value(password, Opts) of
+ not_ok ->
+ {not_ok,Ssh}; % No need to use a failed pwd once more
+ _ ->
+ ssh_transport:ssh_packet(
+ #ssh_msg_userauth_request{user = User,
+ service = Service,
+ method = "keyboard-interactive",
+ data = << ?STRING(<<"">>),
+ ?STRING(<<>>) >> },
+ Ssh)
+ end.
+
publickey_msg([Alg, #ssh{user = User,
session_id = SessionId,
service = Service,
@@ -48,7 +147,7 @@ publickey_msg([Alg, #ssh{user = User,
StrAlgo = atom_to_list(Alg),
case encode_public_key(StrAlgo, ssh_transport:extract_public_key(PrivKey)) of
not_ok ->
- not_ok;
+ {not_ok, Ssh};
PubKeyBlob ->
SigData = build_sig_data(SessionId,
User, Service, PubKeyBlob, StrAlgo),
@@ -65,52 +164,15 @@ publickey_msg([Alg, #ssh{user = User,
Ssh)
end;
_Error ->
- not_ok
- end.
-
-password_msg([#ssh{opts = Opts, io_cb = IoCb,
- user = User, service = Service} = Ssh]) ->
- Password = case proplists:get_value(password, Opts) of
- undefined ->
- user_interaction(IoCb, Ssh);
- PW ->
- PW
- end,
- case Password of
- not_ok ->
- not_ok;
- _ ->
- ssh_transport:ssh_packet(
- #ssh_msg_userauth_request{user = User,
- service = Service,
- method = "password",
- data =
- <<?BOOLEAN(?FALSE),
- ?STRING(unicode:characters_to_binary(Password))>>},
- Ssh)
+ {not_ok, Ssh}
end.
-user_interaction(ssh_no_io, _) ->
- not_ok;
-user_interaction(IoCb, Ssh) ->
- IoCb:read_password("ssh password: ", Ssh).
-
-
-%% See RFC 4256 for info on keyboard-interactive
-keyboard_interactive_msg([#ssh{user = User,
- service = Service} = Ssh]) ->
- ssh_transport:ssh_packet(
- #ssh_msg_userauth_request{user = User,
- service = Service,
- method = "keyboard-interactive",
- data = << ?STRING(<<"">>),
- ?STRING(<<>>) >> },
- Ssh).
-
+%%%----------------------------------------------------------------
service_request_msg(Ssh) ->
ssh_transport:ssh_packet(#ssh_msg_service_request{name = "ssh-userauth"},
Ssh#ssh{service = "ssh-userauth"}).
+%%%----------------------------------------------------------------
init_userauth_request_msg(#ssh{opts = Opts} = Ssh) ->
case user_name(Opts) of
{ok, User} ->
@@ -140,34 +202,9 @@ init_userauth_request_msg(#ssh{opts = Opts} = Ssh) ->
description = ErrStr})
end.
-userauth_request_msg(#ssh{userauth_preference = []} = Ssh) ->
- Msg = #ssh_msg_disconnect{code =
- ?SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE,
- description = "Unable to connect using the available"
- " authentication methods",
- language = "en"},
- {disconnect, Msg, ssh_transport:ssh_packet(Msg, Ssh)};
-
-userauth_request_msg(#ssh{userauth_methods = Methods,
- userauth_preference = [{Pref, Module,
- Function, Args} | Prefs]}
- = Ssh0) ->
- Ssh = Ssh0#ssh{userauth_preference = Prefs},
- case lists:member(Pref, Methods) of
- true ->
- case Module:Function(Args ++ [Ssh]) of
- not_ok ->
- userauth_request_msg(Ssh);
- Result ->
- {Pref,Result}
- end;
- false ->
- userauth_request_msg(Ssh)
- end.
-
-
-handle_userauth_request(#ssh_msg_service_request{name =
- Name = "ssh-userauth"},
+%%%----------------------------------------------------------------
+%%% called by server
+handle_userauth_request(#ssh_msg_service_request{name = Name = "ssh-userauth"},
_, Ssh) ->
{ok, ssh_transport:ssh_packet(#ssh_msg_service_accept{name = Name},
Ssh#ssh{service = "ssh-connection"})};
@@ -319,21 +356,28 @@ handle_userauth_request(#ssh_msg_userauth_request{user = User,
partial_success = false}, Ssh)}.
-
-handle_userauth_info_request(
- #ssh_msg_userauth_info_request{name = Name,
- instruction = Instr,
- num_prompts = NumPrompts,
- data = Data}, IoCb,
- #ssh{opts = Opts} = Ssh) ->
+%%%----------------------------------------------------------------
+%%% keyboard-interactive client
+handle_userauth_info_request(#ssh_msg_userauth_info_request{name = Name,
+ instruction = Instr,
+ num_prompts = NumPrompts,
+ data = Data},
+ #ssh{opts = Opts,
+ io_cb = IoCb
+ } = Ssh) ->
PromptInfos = decode_keyboard_interactive_prompts(NumPrompts,Data),
- Responses = keyboard_interact_get_responses(IoCb, Opts,
- Name, Instr, PromptInfos),
- {ok,
- ssh_transport:ssh_packet(
- #ssh_msg_userauth_info_response{num_responses = NumPrompts,
- data = Responses}, Ssh)}.
+ case keyboard_interact_get_responses(IoCb, Opts, Name, Instr, PromptInfos) of
+ not_ok ->
+ not_ok;
+ Responses ->
+ {ok,
+ ssh_transport:ssh_packet(
+ #ssh_msg_userauth_info_response{num_responses = NumPrompts,
+ data = Responses}, Ssh)}
+ end.
+%%%----------------------------------------------------------------
+%%% keyboard-interactive server
handle_userauth_info_response(#ssh_msg_userauth_info_response{num_responses = 1,
data = <<?UINT32(Sz), Password:Sz/binary>>},
#ssh{opts = Opts,
@@ -369,11 +413,6 @@ method_preference(Algs) ->
[{"publickey", ?MODULE, publickey_msg, [A]} | Acc]
end,
[{"password", ?MODULE, password_msg, []},
- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
{"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []}
],
Algs).
@@ -473,6 +512,9 @@ keyboard_interact_get_responses(IoCb, Opts, Name, Instr, PromptInfos) ->
proplists:get_value(password, Opts, undefined), IoCb, Name,
Instr, PromptInfos, Opts, NumPrompts).
+
+keyboard_interact_get_responses(_, _, not_ok, _, _, _, _, _, _) ->
+ not_ok;
keyboard_interact_get_responses(_, undefined, Password, _, _, _, _, _,
1) when Password =/= undefined ->
[Password]; %% Password auth implemented with keyboard-interaction and passwd is known
@@ -486,17 +528,18 @@ keyboard_interact_get_responses(true, Fun, _Pwd, _IoCb, Name, Instr, PromptInfos
keyboard_interact_fun(Fun, Name, Instr, PromptInfos, NumPrompts).
keyboard_interact(IoCb, Name, Instr, Prompts, Opts) ->
- if Name /= "" -> IoCb:format("~s~n", [Name]);
- true -> ok
- end,
- if Instr /= "" -> IoCb:format("~s~n", [Instr]);
- true -> ok
- end,
+ write_if_nonempty(IoCb, Name),
+ write_if_nonempty(IoCb, Instr),
lists:map(fun({Prompt, true}) -> IoCb:read_line(Prompt, Opts);
({Prompt, false}) -> IoCb:read_password(Prompt, Opts)
end,
Prompts).
+write_if_nonempty(_, "") -> ok;
+write_if_nonempty(_, <<>>) -> ok;
+write_if_nonempty(IoCb, Text) -> IoCb:format("~s~n",[Text]).
+
+
keyboard_interact_fun(KbdInteractFun, Name, Instr, PromptInfos, NumPrompts) ->
Prompts = lists:map(fun({Prompt, _Echo}) -> Prompt end,
PromptInfos),
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl
index e952a333ff..27c205a932 100644
--- a/lib/ssh/src/ssh_connection_handler.erl
+++ b/lib/ssh/src/ssh_connection_handler.erl
@@ -428,7 +428,12 @@ init_connection(server, C = #connection{}, Opts) ->
init_ssh_record(Role, Socket, Opts) ->
{ok, PeerAddr} = inet:peername(Socket),
KeyCb = proplists:get_value(key_cb, Opts, ssh_file),
- AuthMethods = proplists:get_value(auth_methods, Opts, ?SUPPORTED_AUTH_METHODS),
+ AuthMethods = proplists:get_value(auth_methods,
+ Opts,
+ case Role of
+ server -> ?SUPPORTED_AUTH_METHODS;
+ client -> undefined
+ end),
S0 = #ssh{role = Role,
key_cb = KeyCb,
opts = Opts,
@@ -794,9 +799,13 @@ handle_event(_, #ssh_msg_userauth_banner{message = Msg}, {userauth,client}, D) -
handle_event(_, #ssh_msg_userauth_info_request{} = Msg, {userauth_keyboard_interactive, client},
#data{ssh_params = Ssh0} = D) ->
- {ok, {Reply, Ssh}} = ssh_auth:handle_userauth_info_request(Msg, Ssh0#ssh.io_cb, Ssh0),
- send_bytes(Reply, D),
- {next_state, {userauth_keyboard_interactive_info_response,client}, D#data{ssh_params = Ssh}};
+ case ssh_auth:handle_userauth_info_request(Msg, Ssh0) of
+ {ok, {Reply, Ssh}} ->
+ send_bytes(Reply, D),
+ {next_state, {userauth_keyboard_interactive_info_response,client}, D#data{ssh_params = Ssh}};
+ not_ok ->
+ {next_state, {userauth,client}, D, [{next_event, internal, Msg}]}
+ end;
handle_event(_, #ssh_msg_userauth_info_response{} = Msg, {userauth_keyboard_interactive, server}, D) ->
case ssh_auth:handle_userauth_info_response(Msg, D#data.ssh_params) of
@@ -819,7 +828,18 @@ handle_event(_, Msg = #ssh_msg_userauth_failure{}, {userauth_keyboard_interactiv
D = D0#data{ssh_params = Ssh0#ssh{userauth_preference=Prefs}},
{next_state, {userauth,client}, D, [{next_event, internal, Msg}]};
-handle_event(_, Msg=#ssh_msg_userauth_failure{}, {userauth_keyboard_interactive_info_response, client}, D) ->
+handle_event(_, Msg=#ssh_msg_userauth_failure{}, {userauth_keyboard_interactive_info_response, client},
+ #data{ssh_params = Ssh0} = D0) ->
+ Opts = Ssh0#ssh.opts,
+ D = case proplists:get_value(password, Opts) of
+ undefined ->
+ D0;
+ _ ->
+ D0#data{ssh_params =
+ Ssh0#ssh{opts =
+ lists:keyreplace(password,1,Opts,
+ {password,not_ok})}} % FIXME:intermodule dependency
+ end,
{next_state, {userauth,client}, D, [{next_event, internal, Msg}]};
handle_event(_, Msg=#ssh_msg_userauth_success{}, {userauth_keyboard_interactive_info_response, client}, D) ->
diff --git a/lib/ssh/src/ssh_io.erl b/lib/ssh/src/ssh_io.erl
index 026d0f6151..1d8f370884 100644
--- a/lib/ssh/src/ssh_io.erl
+++ b/lib/ssh/src/ssh_io.erl
@@ -31,56 +31,55 @@ read_line(Prompt, Ssh) ->
format("~s", [listify(Prompt)]),
proplists:get_value(user_pid, Ssh) ! {self(), question},
receive
- Answer ->
+ Answer when is_list(Answer) ->
Answer
end.
yes_no(Prompt, Ssh) ->
- io:format("~s [y/n]?", [Prompt]),
+ format("~s [y/n]?", [Prompt]),
proplists:get_value(user_pid, Ssh#ssh.opts) ! {self(), question},
receive
- Answer ->
+ %% I can't see that the atoms y and n are ever received, but it must
+ %% be investigated before removing
+ y -> yes;
+ n -> no;
+
+ Answer when is_list(Answer) ->
case trim(Answer) of
"y" -> yes;
"n" -> no;
"Y" -> yes;
"N" -> no;
- y -> yes;
- n -> no;
_ ->
- io:format("please answer y or n\n"),
+ format("please answer y or n\n",[]),
yes_no(Prompt, Ssh)
end
end.
-read_password(Prompt, Ssh) ->
+read_password(Prompt, #ssh{opts=Opts}) -> read_password(Prompt, Opts);
+read_password(Prompt, Opts) when is_list(Opts) ->
format("~s", [listify(Prompt)]),
- case is_list(Ssh) of
- false ->
- proplists:get_value(user_pid, Ssh#ssh.opts) ! {self(), user_password};
- _ ->
- proplists:get_value(user_pid, Ssh) ! {self(), user_password}
- end,
+ proplists:get_value(user_pid, Opts) ! {self(), user_password},
receive
- Answer ->
- case Answer of
- "" ->
- read_password(Prompt, Ssh);
- Pass -> Pass
- end
+ Answer when is_list(Answer) ->
+ case trim(Answer) of
+ "" ->
+ read_password(Prompt, Opts);
+ Pwd ->
+ Pwd
+ end
end.
-listify(A) when is_atom(A) ->
- atom_to_list(A);
-listify(L) when is_list(L) ->
- L;
-listify(B) when is_binary(B) ->
- binary_to_list(B).
format(Fmt, Args) ->
io:format(Fmt, Args).
+%%%================================================================
+listify(A) when is_atom(A) -> atom_to_list(A);
+listify(L) when is_list(L) -> L;
+listify(B) when is_binary(B) -> binary_to_list(B).
+
trim(Line) when is_list(Line) ->
lists:reverse(trim1(lists:reverse(trim1(Line))));
@@ -93,6 +92,3 @@ trim1([$\r|Cs]) -> trim(Cs);
trim1([$\n|Cs]) -> trim(Cs);
trim1([$\t|Cs]) -> trim(Cs);
trim1(Cs) -> Cs.
-
-
-
diff --git a/lib/ssh/test/ssh_basic_SUITE.erl b/lib/ssh/test/ssh_basic_SUITE.erl
index 733414e23a..d52d453007 100644
--- a/lib/ssh/test/ssh_basic_SUITE.erl
+++ b/lib/ssh/test/ssh_basic_SUITE.erl
@@ -50,7 +50,12 @@
inet6_option/1,
inet_option/1,
internal_error/1,
- known_hosts/1,
+ known_hosts/1,
+ login_bad_pwd_no_retry1/1,
+ login_bad_pwd_no_retry2/1,
+ login_bad_pwd_no_retry3/1,
+ login_bad_pwd_no_retry4/1,
+ login_bad_pwd_no_retry5/1,
misc_ssh_options/1,
openssh_zlib_basic_test/1,
packet_size_zero/1,
@@ -100,7 +105,8 @@ all() ->
daemon_opt_fd,
multi_daemon_opt_fd,
packet_size_zero,
- ssh_info_print
+ ssh_info_print,
+ {group, login_bad_pwd_no_retry}
].
groups() ->
@@ -116,7 +122,13 @@ groups() ->
{dsa_pass_key, [], [pass_phrase]},
{rsa_pass_key, [], [pass_phrase]},
{key_cb, [], [key_callback, key_callback_options]},
- {internal_error, [], [internal_error]}
+ {internal_error, [], [internal_error]},
+ {login_bad_pwd_no_retry, [], [login_bad_pwd_no_retry1,
+ login_bad_pwd_no_retry2,
+ login_bad_pwd_no_retry3,
+ login_bad_pwd_no_retry4,
+ login_bad_pwd_no_retry5
+ ]}
].
@@ -1090,6 +1102,72 @@ ssh_info_print(Config) ->
%%--------------------------------------------------------------------
+%% Check that a basd pwd is not tried more times. Could cause lock-out
+%% on server
+
+login_bad_pwd_no_retry1(Config) ->
+ login_bad_pwd_no_retry(Config, "keyboard-interactive,password").
+
+login_bad_pwd_no_retry2(Config) ->
+ login_bad_pwd_no_retry(Config, "password,keyboard-interactive").
+
+login_bad_pwd_no_retry3(Config) ->
+ login_bad_pwd_no_retry(Config, "password,publickey,keyboard-interactive").
+
+login_bad_pwd_no_retry4(Config) ->
+ login_bad_pwd_no_retry(Config, "password,other,keyboard-interactive").
+
+login_bad_pwd_no_retry5(Config) ->
+ login_bad_pwd_no_retry(Config, "password,other,keyboard-interactive,password,password").
+
+
+
+
+
+login_bad_pwd_no_retry(Config, AuthMethods) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
+ file:make_dir(UserDir),
+ SysDir = proplists:get_value(data_dir, Config),
+
+ Parent = self(),
+ PwdFun = fun(_, _, _, undefined) -> {false, 1};
+ (_, _, _, _) -> Parent ! retry_bad_pwd,
+ false
+ end,
+
+ {DaemonRef, _Host, Port} =
+ ssh_test_lib:daemon([{system_dir, SysDir},
+ {user_dir, UserDir},
+ {auth_methods, AuthMethods},
+ {user_passwords, [{"foo","somepwd"}]},
+ {pwdfun, PwdFun}
+ ]),
+
+ ConnRes = ssh:connect("localhost", Port,
+ [{silently_accept_hosts, true},
+ {user, "foo"},
+ {password, "badpwd"},
+ {user_dir, UserDir},
+ {user_interaction, false}]),
+
+ receive
+ retry_bad_pwd ->
+ ssh:stop_daemon(DaemonRef),
+ {fail, "Retry bad password"}
+ after 0 ->
+ case ConnRes of
+ {error,"Unable to connect using the available authentication methods"} ->
+ ssh:stop_daemon(DaemonRef),
+ ok;
+ {ok,Conn} ->
+ ssh:close(Conn),
+ ssh:stop_daemon(DaemonRef),
+ {fail, "Connect erroneosly succeded"}
+ end
+ end.
+
+%%--------------------------------------------------------------------
%% Internal functions ------------------------------------------------
%%--------------------------------------------------------------------
%% Due to timing the error message may or may not be delivered to
diff --git a/lib/ssl/doc/src/notes.xml b/lib/ssl/doc/src/notes.xml
index c427db24a4..3b6f988a2d 100644
--- a/lib/ssl/doc/src/notes.xml
+++ b/lib/ssl/doc/src/notes.xml
@@ -28,6 +28,160 @@
<p>This document describes the changes made to the SSL application.</p>
+<section><title>SSL 8.0</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Server now rejects, a not requested client cert, as an
+ incorrect handshake message and ends the connection.</p>
+ <p>
+ Own Id: OTP-13651</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Remove default support for DES cipher suites</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13195</p>
+ </item>
+ <item>
+ <p>
+ Deprecate the function <c>crypto:rand_bytes</c> and make
+ sure that <c>crypto:strong_rand_bytes</c> is used in all
+ places that are cryptographically significant.</p>
+ <p>
+ Own Id: OTP-13214</p>
+ </item>
+ <item>
+ <p>
+ Better error handling of user error during TLS upgrade.
+ ERL-69 is solved by gen_statem rewrite of ssl
+ application.</p>
+ <p>
+ Own Id: OTP-13255</p>
+ </item>
+ <item>
+ <p>
+ Provide user friendly error message when crypto rejects a
+ key</p>
+ <p>
+ Own Id: OTP-13256</p>
+ </item>
+ <item>
+ <p>
+ Add ssl:getstat/1 and ssl:getstat/2</p>
+ <p>
+ Own Id: OTP-13415</p>
+ </item>
+ <item>
+ <p>
+ TLS distribution connections now allow specifying the
+ options <c>verify_fun</c>, <c>crl_check</c> and
+ <c>crl_cache</c>. See the documentation. GitHub pull req
+ #956 contributed by Magnus Henoch.</p>
+ <p>
+ Own Id: OTP-13429 Aux Id: Pull#956 </p>
+ </item>
+ <item>
+ <p>
+ Remove confusing error message when closing a distributed
+ erlang node running over TLS</p>
+ <p>
+ Own Id: OTP-13431</p>
+ </item>
+ <item>
+ <p>
+ Remove default support for use of md5 in TLS 1.2
+ signature algorithms</p>
+ <p>
+ Own Id: OTP-13463</p>
+ </item>
+ <item>
+ <p>
+ ssl now uses gen_statem instead of gen_fsm to implement
+ the ssl connection process, this solves some timing
+ issues in addition to making the code more intuitive as
+ the behaviour can be used cleanly instead of having a lot
+ of workaround for shortcomings of the behaviour.</p>
+ <p>
+ Own Id: OTP-13464</p>
+ </item>
+ <item>
+ <p>
+ Phase out interoperability with clients that offer SSLv2.
+ By default they are no longer supported, but an option to
+ provide interoperability is offered.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13465</p>
+ </item>
+ <item>
+ <p>
+ OpenSSL has functions to generate short (eight hex
+ digits) hashes of issuers of certificates and CRLs. These
+ hashes are used by the "c_rehash" script to populate
+ directories of CA certificates and CRLs, e.g. in the
+ Apache web server. Add functionality to let an Erlang
+ program find the right CRL for a given certificate in
+ such a directory.</p>
+ <p>
+ Own Id: OTP-13530</p>
+ </item>
+ <item>
+ <p>
+ Some legacy TLS 1.0 software does not tolerate the 1/n-1
+ content split BEAST mitigation technique. Add a
+ beast_mitigation SSL option (defaulting to
+ one_n_minus_one) to select or disable the BEAST
+ mitigation technique.</p>
+ <p>
+ Own Id: OTP-13629</p>
+ </item>
+ <item>
+ <p>
+ Enhance error log messages to facilitate for users to
+ understand the error</p>
+ <p>
+ Own Id: OTP-13632</p>
+ </item>
+ <item>
+ <p>
+ Increased default DH params to 2048-bit</p>
+ <p>
+ Own Id: OTP-13636</p>
+ </item>
+ <item>
+ <p>
+ Propagate CRL unknown CA error so that public_key
+ validation process continues correctly and determines
+ what should happen.</p>
+ <p>
+ Own Id: OTP-13656</p>
+ </item>
+ <item>
+ <p>
+ Introduce a flight concept for handshake packages. This
+ is a preparation for enabling DTLS, however it can also
+ have a positive effects for TLS on slow and unreliable
+ networks.</p>
+ <p>
+ Own Id: OTP-13678</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>SSL 7.3.3</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/ssl/doc/src/ssl_app.xml b/lib/ssl/doc/src/ssl_app.xml
index 0b3fa9a8a9..a66e947bc1 100644
--- a/lib/ssl/doc/src/ssl_app.xml
+++ b/lib/ssl/doc/src/ssl_app.xml
@@ -45,6 +45,8 @@
but can be configured.</item>
<item>For security reasons DES cipher suites are no longer supported by default,
but can be configured.</item>
+ <item> Renegotiation Indication Extension <url href="http://www.ietf.org/rfc/rfc5746.txt">RFC 5746</url> is supported
+ </item>
<item>Ephemeral Diffie-Hellman cipher suites are supported,
but not Diffie Hellman Certificates cipher suites.</item>
<item>Elliptic Curve cipher suites are supported if the Crypto
@@ -55,10 +57,16 @@
<item>IDEA cipher suites are not supported as they have
become deprecated by the latest TLS specification so it is not
motivated to implement them.</item>
+ <item>Compression is not supported.</item>
<item>CRL validation is supported.</item>
<item>Policy certificate extensions are not supported.</item>
<item>'Server Name Indication' extension
(<url href="http://www.ietf.org/rfc/rfc6066.txt">RFC 6066</url>) is supported.</item>
+ <item>Application Layer Protocol Negotiation (ALPN) and its successor Next Protocol Negotiation (NPN)
+ are supported. </item>
+ <item>It is possible to use Pre-Shared Key (PSK) and Secure Remote Password (SRP)
+ cipher suites, but they are not enabled by default.
+ </item>
</list>
</description>
diff --git a/lib/ssl/test/ssl_dist_SUITE.erl b/lib/ssl/test/ssl_dist_SUITE.erl
index 5ebf9bb2de..55aa2eda2d 100644
--- a/lib/ssl/test/ssl_dist_SUITE.erl
+++ b/lib/ssl/test/ssl_dist_SUITE.erl
@@ -109,11 +109,11 @@ common_end(_, _Config) ->
basic() ->
[{doc,"Test that two nodes can connect via ssl distribution"}].
basic(Config) when is_list(Config) ->
- NH1 = start_ssl_node(Config),
+ gen_dist_test(basic_test, Config).
+
+basic_test(NH1, NH2, _) ->
Node1 = NH1#node_handle.nodename,
- NH2 = start_ssl_node(Config),
Node2 = NH2#node_handle.nodename,
-
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
[Node2] = apply_on_ssl_node(NH1, fun () -> nodes() end),
@@ -161,18 +161,16 @@ basic(Config) when is_list(Config) ->
ok
end
end)
- end,
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
+ end.
%%--------------------------------------------------------------------
payload() ->
[{doc,"Test that send a lot of data between the ssl distributed noes"}].
payload(Config) when is_list(Config) ->
- NH1 = start_ssl_node(Config),
+ gen_dist_test(payload_test, Config).
+
+payload_test(NH1, NH2, _) ->
Node1 = NH1#node_handle.nodename,
- NH2 = start_ssl_node(Config),
Node2 = NH2#node_handle.nodename,
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
@@ -204,10 +202,8 @@ payload(Config) when is_list(Config) ->
ok
end
end)
- end,
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
+ end.
+
%%--------------------------------------------------------------------
plain_options() ->
[{doc,"Test specifying additional options"}].
@@ -218,20 +214,17 @@ plain_options(Config) when is_list(Config) ->
"client_verify verify_none server_verify verify_none "
"server_depth 1 client_depth 1 "
"server_hibernate_after 500 client_hibernate_after 500",
+ gen_dist_test(plain_options_test, [{additional_dist_opts, DistOpts} | Config]).
- NH1 = start_ssl_node([{additional_dist_opts, DistOpts} | Config]),
+plain_options_test(NH1, NH2, _) ->
Node1 = NH1#node_handle.nodename,
- NH2 = start_ssl_node([{additional_dist_opts, DistOpts} | Config]),
Node2 = NH2#node_handle.nodename,
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
[Node2] = apply_on_ssl_node(NH1, fun () -> nodes() end),
- [Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end),
+ [Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end).
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
%%--------------------------------------------------------------------
plain_verify_options() ->
[{doc,"Test specifying additional options"}].
@@ -240,20 +233,18 @@ plain_verify_options(Config) when is_list(Config) ->
"client_secure_renegotiate true "
"server_reuse_sessions true client_reuse_sessions true "
"server_hibernate_after 500 client_hibernate_after 500",
+ gen_dist_test(plain_verify_options_test, [{additional_dist_opts, DistOpts} | Config]).
- NH1 = start_ssl_node([{additional_dist_opts, DistOpts} | Config]),
+plain_verify_options_test(NH1, NH2, _) ->
Node1 = NH1#node_handle.nodename,
- NH2 = start_ssl_node([{additional_dist_opts, DistOpts} | Config]),
Node2 = NH2#node_handle.nodename,
-
+
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
-
+
[Node2] = apply_on_ssl_node(NH1, fun () -> nodes() end),
- [Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end),
+ [Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end).
+
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
%%--------------------------------------------------------------------
nodelay_option() ->
[{doc,"Test specifying dist_nodelay option"}].
@@ -265,6 +256,7 @@ nodelay_option(Config) ->
after
application:unset_env(kernel, dist_nodelay)
end.
+%%--------------------------------------------------------------------
listen_port_options() ->
[{doc, "Test specifying listening ports"}].
@@ -285,32 +277,39 @@ listen_port_options(Config) when is_list(Config) ->
#node_handle{} ->
%% If the node was able to start, it didn't take the port
%% option into account.
+ stop_ssl_node(NH1),
exit(unexpected_success)
catch
exit:{accept_failed, timeout} ->
%% The node failed to start, as expected.
ok
end,
-
+
%% Try again, now specifying a high max port.
PortOpt2 = "-kernel inet_dist_listen_min " ++ integer_to_list(Port1) ++
- " inet_dist_listen_max 65535",
+ " inet_dist_listen_max 65535",
NH2 = start_ssl_node([{additional_dist_opts, PortOpt2} | Config]),
- Node2 = NH2#node_handle.nodename,
- Name2 = lists:takewhile(fun(C) -> C =/= $@ end, atom_to_list(Node2)),
- {ok, NodesPorts2} = apply_on_ssl_node(NH2, fun net_adm:names/0),
- {Name2, Port2} = lists:keyfind(Name2, 1, NodesPorts2),
-
- %% The new port should be higher:
- if Port2 > Port1 ->
- ok;
- true ->
- error({port, Port2, not_higher_than, Port1})
+
+ try
+ Node2 = NH2#node_handle.nodename,
+ Name2 = lists:takewhile(fun(C) -> C =/= $@ end, atom_to_list(Node2)),
+ {ok, NodesPorts2} = apply_on_ssl_node(NH2, fun net_adm:names/0),
+ {Name2, Port2} = lists:keyfind(Name2, 1, NodesPorts2),
+
+ %% The new port should be higher:
+ if Port2 > Port1 ->
+ ok;
+ true ->
+ error({port, Port2, not_higher_than, Port1})
+ end
+ catch
+ _:Reason ->
+ stop_ssl_node(NH2),
+ ct:fail(Reason)
end,
-
- stop_ssl_node(NH1),
stop_ssl_node(NH2),
success(Config).
+
%%--------------------------------------------------------------------
listen_options() ->
[{doc, "Test inet_dist_listen_options"}].
@@ -329,28 +328,25 @@ do_listen_options(Prio, Config) ->
end,
Options = "-kernel inet_dist_listen_options " ++ PriorityString,
-
- NH1 = start_ssl_node([{additional_dist_opts, Options} | Config]),
- NH2 = start_ssl_node([{additional_dist_opts, Options} | Config]),
- Node2 = NH2#node_handle.nodename,
-
+ gen_dist_test(listen_options_test, [{prio, Prio}, {additional_dist_opts, Options} | Config]).
+
+listen_options_test(NH1, NH2, Config) ->
+ Prio = proplists:get_value(prio, Config),
+ Node2 = NH2#node_handle.nodename,
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
PrioritiesNode1 =
apply_on_ssl_node(NH1, fun get_socket_priorities/0),
PrioritiesNode2 =
apply_on_ssl_node(NH2, fun get_socket_priorities/0),
-
+
Elevated1 = [P || P <- PrioritiesNode1, P =:= Prio],
- ?t:format("Elevated1: ~p~n", [Elevated1]),
+ ct:pal("Elevated1: ~p~n", [Elevated1]),
Elevated2 = [P || P <- PrioritiesNode2, P =:= Prio],
- ?t:format("Elevated2: ~p~n", [Elevated2]),
+ ct:pal("Elevated2: ~p~n", [Elevated2]),
[_|_] = Elevated1,
- [_|_] = Elevated2,
+ [_|_] = Elevated2.
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
%%--------------------------------------------------------------------
connect_options() ->
[{doc, "Test inet_dist_connect_options"}].
@@ -369,9 +365,11 @@ do_connect_options(Prio, Config) ->
end,
Options = "-kernel inet_dist_connect_options " ++ PriorityString,
+ gen_dist_test(connect_options_test,
+ [{prio, Prio}, {additional_dist_opts, Options} | Config]).
- NH1 = start_ssl_node([{additional_dist_opts, Options} | Config]),
- NH2 = start_ssl_node([{additional_dist_opts, Options} | Config]),
+connect_options_test(NH1, NH2, Config) ->
+ Prio = proplists:get_value(prio, Config),
Node2 = NH2#node_handle.nodename,
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
@@ -382,17 +380,14 @@ do_connect_options(Prio, Config) ->
apply_on_ssl_node(NH2, fun get_socket_priorities/0),
Elevated1 = [P || P <- PrioritiesNode1, P =:= Prio],
- ?t:format("Elevated1: ~p~n", [Elevated1]),
+ ct:pal("Elevated1: ~p~n", [Elevated1]),
Elevated2 = [P || P <- PrioritiesNode2, P =:= Prio],
- ?t:format("Elevated2: ~p~n", [Elevated2]),
+ ct:pal("Elevated2: ~p~n", [Elevated2]),
%% Node 1 will have a socket with elevated priority.
[_|_] = Elevated1,
%% Node 2 will not, since it only applies to outbound connections.
- [] = Elevated2,
+ [] = Elevated2.
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
%%--------------------------------------------------------------------
use_interface() ->
[{doc, "Test inet_dist_use_interface"}].
@@ -403,22 +398,28 @@ use_interface(Config) when is_list(Config) ->
%% Start a node, and get the port number it's listening on.
NH1 = start_ssl_node([{additional_dist_opts, Options} | Config]),
- Node1 = NH1#node_handle.nodename,
- Name = lists:takewhile(fun(C) -> C =/= $@ end, atom_to_list(Node1)),
- {ok, NodesPorts} = apply_on_ssl_node(NH1, fun net_adm:names/0),
- {Name, Port} = lists:keyfind(Name, 1, NodesPorts),
-
- %% Now find the socket listening on that port, and check its sockname.
- Sockets = apply_on_ssl_node(
- NH1,
- fun() ->
- [inet:sockname(P) ||
- P <- inet_ports(),
- {ok, Port} =:= (catch inet:port(P))]
- end),
- %% And check that it's actually listening on localhost.
- [{ok,{{127,0,0,1},Port}}] = Sockets,
-
+
+ try
+ Node1 = NH1#node_handle.nodename,
+ Name = lists:takewhile(fun(C) -> C =/= $@ end, atom_to_list(Node1)),
+ {ok, NodesPorts} = apply_on_ssl_node(NH1, fun net_adm:names/0),
+ {Name, Port} = lists:keyfind(Name, 1, NodesPorts),
+
+ %% Now find the socket listening on that port, and check its sockname.
+ Sockets = apply_on_ssl_node(
+ NH1,
+ fun() ->
+ [inet:sockname(P) ||
+ P <- inet_ports(),
+ {ok, Port} =:= (catch inet:port(P))]
+ end),
+ %% And check that it's actually listening on localhost.
+ [{ok,{{127,0,0,1},Port}}] = Sockets
+ catch
+ _:Reason ->
+ stop_ssl_node(NH1),
+ ct:fail(Reason)
+ end,
stop_ssl_node(NH1),
success(Config).
%%--------------------------------------------------------------------
@@ -430,11 +431,11 @@ verify_fun_fail(Config) when is_list(Config) ->
"\"{ssl_dist_SUITE,verify_fail_always,{}}\" "
"client_verify verify_peer client_verify_fun "
"\"{ssl_dist_SUITE,verify_fail_always,{}}\" ",
+ gen_dist_test(verify_fun_fail_test, [{additional_dist_opts, DistOpts} | Config]).
- NH1 = start_ssl_node([{additional_dist_opts, DistOpts} | Config]),
- NH2 = start_ssl_node([{additional_dist_opts, DistOpts} | Config]),
+verify_fun_fail_test(NH1, NH2, _) ->
Node2 = NH2#node_handle.nodename,
-
+
pang = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
[] = apply_on_ssl_node(NH1, fun () -> nodes() end),
@@ -446,25 +447,9 @@ verify_fun_fail(Config) when is_list(Config) ->
%% On the server node, it wouldn't run, because the server didn't
%% request a certificate from the client.
undefined =
- apply_on_ssl_node(NH2, fun () -> ets:info(verify_fun_ran) end),
+ apply_on_ssl_node(NH2, fun () -> ets:info(verify_fun_ran) end).
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
-verify_fail_always(_Certificate, _Event, _State) ->
- %% Create an ETS table, to record the fact that the verify function ran.
- %% Spawn a new process, to avoid the ETS table disappearing.
- Parent = self(),
- spawn(
- fun() ->
- ets:new(verify_fun_ran, [public, named_table]),
- ets:insert(verify_fun_ran, {verify_fail_always_ran, true}),
- Parent ! go_ahead,
- timer:sleep(infinity)
- end),
- receive go_ahead -> ok end,
- {fail, bad_certificate}.
%%--------------------------------------------------------------------
verify_fun_pass() ->
@@ -476,10 +461,10 @@ verify_fun_pass(Config) when is_list(Config) ->
"server_fail_if_no_peer_cert true "
"client_verify verify_peer client_verify_fun "
"\"{ssl_dist_SUITE,verify_pass_always,{}}\" ",
+ gen_dist_test(verify_fun_pass_test, [{additional_dist_opts, DistOpts} | Config]).
- NH1 = start_ssl_node([{additional_dist_opts, DistOpts} | Config]),
+verify_fun_pass_test(NH1, NH2, _) ->
Node1 = NH1#node_handle.nodename,
- NH2 = start_ssl_node([{additional_dist_opts, DistOpts} | Config]),
Node2 = NH2#node_handle.nodename,
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
@@ -494,25 +479,8 @@ verify_fun_pass(Config) when is_list(Config) ->
%% requested and verified the client's certificate because we
%% passed fail_if_no_peer_cert.
[{verify_pass_always_ran, true}] =
- apply_on_ssl_node(NH2, fun () -> ets:tab2list(verify_fun_ran) end),
+ apply_on_ssl_node(NH2, fun () -> ets:tab2list(verify_fun_ran) end).
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
-
-verify_pass_always(_Certificate, _Event, State) ->
- %% Create an ETS table, to record the fact that the verify function ran.
- %% Spawn a new process, to avoid the ETS table disappearing.
- Parent = self(),
- spawn(
- fun() ->
- ets:new(verify_fun_ran, [public, named_table]),
- ets:insert(verify_fun_ran, {verify_pass_always_ran, true}),
- Parent ! go_ahead,
- timer:sleep(infinity)
- end),
- receive go_ahead -> ok end,
- {valid, State}.
%%--------------------------------------------------------------------
crl_check_pass() ->
[{doc,"Test crl_check with non-revoked certificate"}].
@@ -520,10 +488,10 @@ crl_check_pass(Config) when is_list(Config) ->
DistOpts = "-ssl_dist_opt client_crl_check true",
NewConfig =
[{many_verify_opts, true}, {additional_dist_opts, DistOpts}] ++ Config,
+ gen_dist_test(crl_check_pass_test, NewConfig).
- NH1 = start_ssl_node(NewConfig),
+crl_check_pass_test(NH1, NH2, Config) ->
Node1 = NH1#node_handle.nodename,
- NH2 = start_ssl_node(NewConfig),
Node2 = NH2#node_handle.nodename,
PrivDir = ?config(priv_dir, Config),
@@ -533,11 +501,7 @@ crl_check_pass(Config) when is_list(Config) ->
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
[Node2] = apply_on_ssl_node(NH1, fun () -> nodes() end),
- [Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end),
-
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
+ [Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end).
%%--------------------------------------------------------------------
crl_check_fail() ->
@@ -549,10 +513,9 @@ crl_check_fail(Config) when is_list(Config) ->
%% The server uses a revoked certificate.
{server_cert_dir, "revoked"},
{additional_dist_opts, DistOpts}] ++ Config,
+ gen_dist_test(crl_check_fail_test, NewConfig).
- NH1 = start_ssl_node(NewConfig),
- %%Node1 = NH1#node_handle.nodename,
- NH2 = start_ssl_node(NewConfig),
+crl_check_fail_test(NH1, NH2, Config) ->
Node2 = NH2#node_handle.nodename,
PrivDir = ?config(priv_dir, Config),
@@ -562,11 +525,7 @@ crl_check_fail(Config) when is_list(Config) ->
pang = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
[] = apply_on_ssl_node(NH1, fun () -> nodes() end),
- [] = apply_on_ssl_node(NH2, fun () -> nodes() end),
-
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
+ [] = apply_on_ssl_node(NH2, fun () -> nodes() end).
%%--------------------------------------------------------------------
crl_check_best_effort() ->
@@ -576,22 +535,18 @@ crl_check_best_effort(Config) when is_list(Config) ->
"server_verify verify_peer server_crl_check best_effort",
NewConfig =
[{many_verify_opts, true}, {additional_dist_opts, DistOpts}] ++ Config,
+ gen_dist_test(crl_check_best_effort_test, NewConfig).
+crl_check_best_effort_test(NH1, NH2, _Config) ->
%% We don't have the correct CRL at hand, but since crl_check is
%% best_effort, we accept it anyway.
- NH1 = start_ssl_node(NewConfig),
Node1 = NH1#node_handle.nodename,
- NH2 = start_ssl_node(NewConfig),
Node2 = NH2#node_handle.nodename,
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
[Node2] = apply_on_ssl_node(NH1, fun () -> nodes() end),
- [Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end),
-
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
+ [Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end).
%%--------------------------------------------------------------------
crl_cache_check_pass() ->
@@ -605,20 +560,16 @@ crl_cache_check_pass(Config) when is_list(Config) ->
"\"{ssl_dist_SUITE,{\\\"" ++ NodeDir ++ "\\\",[]}}\"",
NewConfig =
[{many_verify_opts, true}, {additional_dist_opts, DistOpts}] ++ Config,
+ gen_dist_test(crl_cache_check_pass_test, NewConfig).
- NH1 = start_ssl_node(NewConfig),
+crl_cache_check_pass_test(NH1, NH2, _) ->
Node1 = NH1#node_handle.nodename,
- NH2 = start_ssl_node(NewConfig),
Node2 = NH2#node_handle.nodename,
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
[Node2] = apply_on_ssl_node(NH1, fun () -> nodes() end),
- [Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end),
-
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
+ [Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end).
%%--------------------------------------------------------------------
crl_cache_check_fail() ->
@@ -636,44 +587,31 @@ crl_cache_check_fail(Config) when is_list(Config) ->
{server_cert_dir, "revoked"},
{additional_dist_opts, DistOpts}] ++ Config,
- NH1 = start_ssl_node(NewConfig),
- NH2 = start_ssl_node(NewConfig),
- Node2 = NH2#node_handle.nodename,
+ gen_dist_test(crl_cache_check_fail_test, NewConfig).
+crl_cache_check_fail_test(NH1, NH2, _) ->
+ Node2 = NH2#node_handle.nodename,
pang = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
[] = apply_on_ssl_node(NH1, fun () -> nodes() end),
- [] = apply_on_ssl_node(NH2, fun () -> nodes() end),
-
- stop_ssl_node(NH1),
- stop_ssl_node(NH2),
- success(Config).
-
-%% ssl_crl_cache_api callbacks
-lookup(_DistributionPoint, _DbHandle) ->
- not_available.
-
-select({rdnSequence, NameParts}, {NodeDir, _}) ->
- %% Extract the CN from the issuer name...
- [CN] = [CN ||
- [#'AttributeTypeAndValue'{
- type = ?'id-at-commonName',
- value = <<_, _, CN/binary>>}] <- NameParts],
- %% ...and use that as the directory name to find the CRL.
- error_logger:info_report([{found_cn, CN}]),
- CRLFile = filename:join([NodeDir, CN, "crl.pem"]),
- {ok, PemBin} = file:read_file(CRLFile),
- PemEntries = public_key:pem_decode(PemBin),
- CRLs = [ CRL || {'CertificateList', CRL, not_encrypted}
- <- PemEntries],
- CRLs.
-
-fresh_crl(_DistributionPoint, CRL) ->
- CRL.
-
+ [] = apply_on_ssl_node(NH2, fun () -> nodes() end).
%%--------------------------------------------------------------------
%%% Internal functions -----------------------------------------------
%%--------------------------------------------------------------------
+gen_dist_test(Test, Config) ->
+ NH1 = start_ssl_node(Config),
+ NH2 = start_ssl_node(Config),
+ try
+ ?MODULE:Test(NH1, NH2, Config)
+ catch
+ _:Reason ->
+ stop_ssl_node(NH1),
+ stop_ssl_node(NH2),
+ ct:fail(Reason)
+ end,
+ stop_ssl_node(NH1),
+ stop_ssl_node(NH2),
+ success(Config).
%% ssl_node side api
%%
@@ -1226,3 +1164,53 @@ vsn(App) ->
after
application:stop(ssl)
end.
+
+verify_fail_always(_Certificate, _Event, _State) ->
+ %% Create an ETS table, to record the fact that the verify function ran.
+ %% Spawn a new process, to avoid the ETS table disappearing.
+ Parent = self(),
+ spawn(
+ fun() ->
+ ets:new(verify_fun_ran, [public, named_table]),
+ ets:insert(verify_fun_ran, {verify_fail_always_ran, true}),
+ Parent ! go_ahead,
+ timer:sleep(infinity)
+ end),
+ receive go_ahead -> ok end,
+ {fail, bad_certificate}.
+
+verify_pass_always(_Certificate, _Event, State) ->
+ %% Create an ETS table, to record the fact that the verify function ran.
+ %% Spawn a new process, to avoid the ETS table disappearing.
+ Parent = self(),
+ spawn(
+ fun() ->
+ ets:new(verify_fun_ran, [public, named_table]),
+ ets:insert(verify_fun_ran, {verify_pass_always_ran, true}),
+ Parent ! go_ahead,
+ timer:sleep(infinity)
+ end),
+ receive go_ahead -> ok end,
+ {valid, State}.
+
+%% ssl_crl_cache_api callbacks
+lookup(_DistributionPoint, _DbHandle) ->
+ not_available.
+
+select({rdnSequence, NameParts}, {NodeDir, _}) ->
+ %% Extract the CN from the issuer name...
+ [CN] = [CN ||
+ [#'AttributeTypeAndValue'{
+ type = ?'id-at-commonName',
+ value = <<_, _, CN/binary>>}] <- NameParts],
+ %% ...and use that as the directory name to find the CRL.
+ error_logger:info_report([{found_cn, CN}]),
+ CRLFile = filename:join([NodeDir, CN, "crl.pem"]),
+ {ok, PemBin} = file:read_file(CRLFile),
+ PemEntries = public_key:pem_decode(PemBin),
+ CRLs = [ CRL || {'CertificateList', CRL, not_encrypted}
+ <- PemEntries],
+ CRLs.
+
+fresh_crl(_DistributionPoint, CRL) ->
+ CRL.
diff --git a/lib/stdlib/doc/src/notes.xml b/lib/stdlib/doc/src/notes.xml
index 87f5335723..ad2599c5a0 100644
--- a/lib/stdlib/doc/src/notes.xml
+++ b/lib/stdlib/doc/src/notes.xml
@@ -31,6 +31,320 @@
</header>
<p>This document describes the changes made to the STDLIB application.</p>
+<section><title>STDLIB 3.0</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p> Fix a race bug affecting <c>dets:open_file/2</c>.
+ </p>
+ <p>
+ Own Id: OTP-13260 Aux Id: seq13002 </p>
+ </item>
+ <item>
+ <p>Don't search for non-existing Map keys twice</p>
+ <p>For <c>maps:get/2,3</c> and <c>maps:find/2</c>,
+ searching for an immediate key, e.g. an atom, in a small
+ map, the search was performed twice if the key did not
+ exist.</p>
+ <p>
+ Own Id: OTP-13459</p>
+ </item>
+ <item>
+ <p>
+ Avoid stray corner-case math errors on Solaris, e.g. an
+ error is thrown on underflows in exp() and pow() when it
+ shouldn't be.</p>
+ <p>
+ Own Id: OTP-13531</p>
+ </item>
+ <item>
+ <p>Fix linting of map key variables</p>
+ <p>Map keys cannot be unbound and then used in parallel
+ matching.</p>
+ <p>Example: <c> #{ K := V } = #{ k := K } = M.</c> This
+ is illegal if <c>'K'</c> is not bound.</p>
+ <p>
+ Own Id: OTP-13534 Aux Id: ERL-135 </p>
+ </item>
+ <item>
+ <p>
+ Fixed a bug in re on openbsd where sometimes re:run would
+ return an incorrect result.</p>
+ <p>
+ Own Id: OTP-13602</p>
+ </item>
+ <item>
+ <p>
+ To avoid potential timer bottleneck on supervisor
+ restart, timer server is no longer used when the
+ supervisor is unable to restart a child.</p>
+ <p>
+ Own Id: OTP-13618 Aux Id: PR-1001 </p>
+ </item>
+ <item>
+ <p> The Erlang code preprocessor (<c>epp</c>) can handle
+ file names spanning over many tokens. Example:
+ <c>-include("a" "file" "name").</c>. </p>
+ <p>
+ Own Id: OTP-13662 Aux Id: seq13136 </p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>The types of The Abstract Format in the
+ <c>erl_parse</c> module have been refined. </p>
+ <p>
+ Own Id: OTP-10292</p>
+ </item>
+ <item>
+ <p> Undocumented syntax for function specifications,
+ <c>-spec F/A :: Domain -&gt; Range</c>, has been removed
+ (without deprecation). </p> <p> Using the
+ <c>is_subtype(V, T)</c> syntax for constraints (in
+ function specifications) is no longer documented, and the
+ newer syntax <c>V :: T</c> should be used instead. The
+ Erlang Parser still recognizes the <c>is_subtype</c>
+ syntax, and will continue to do so for some time. </p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-11879</p>
+ </item>
+ <item>
+ <p>The '<c>random</c>' module has been deprecated. Use
+ the '<c>rand</c>' module instead.</p>
+ <p>
+ Own Id: OTP-12502 Aux Id: OTP-12501 </p>
+ </item>
+ <item>
+ <p>Background: In record fields with a type declaration
+ but without an initializer, the Erlang parser inserted
+ automatically the singleton type <c>'undefined'</c> to
+ the list of declared types, if that value was not present
+ there. That is, the record declaration:</p>
+ <p>
+ -record(rec, {f1 :: float(), f2 = 42 :: integer(), f3 ::
+ some_mod:some_typ()}).</p>
+ <p>was translated by the parser to:</p>
+ <p>
+ -record(rec, {f1 :: float() | 'undefined', f2 = 42 ::
+ integer(), f3 :: some_mod:some_typ() | 'undefined'}).</p>
+ <p>The rationale for this was that creation of a "dummy"
+ <c>#rec{}</c> record should not result in a warning from
+ dialyzer that, for example, the implicit initialization
+ of the <c>#rec.f1</c> field violates its type
+ declaration.</p>
+ <p>Problems: This seemingly innocent action has some
+ unforeseen consequences.</p>
+ <p>For starters, there is no way for programmers to
+ declare that e.g. only floats make sense for the
+ <c>f1</c> field of <c>#rec{}</c> records when there is no
+ "obvious" default initializer for this field. (This also
+ affects tools like PropEr that use these declarations
+ produced by the Erlang parser to generate random
+ instances of records for testing purposes.)</p>
+ <p>It also means that dialyzer does not warn if e.g. an
+ <c>is_atom/1</c> test or something more exotic like an
+ <c>atom_to_list/1</c> call is performed on the value of
+ the <c>f1</c> field.</p>
+ <p>Similarly, there is no way to extend dialyzer to warn
+ if it finds record constructions where <c>f1</c> is not
+ initialized to some float.</p>
+ <p>Last but not least, it is semantically problematic
+ when the type of the field is an opaque type: creating a
+ union of an opaque and a structured type is very
+ problematic for analysis because it fundamentally breaks
+ the opacity of the term at that point.</p>
+ <p>Change: To solve these problems the parser will not
+ automatically insert the <c>'undefined'</c> value
+ anymore; instead the user has the option to choose the
+ places where this value makes sense (for the field) and
+ where it does not and insert the <c>| 'undefined'</c>
+ there manually.</p>
+ <p>Consequences of this change: This change means that
+ dialyzer will issue a warning for all places where
+ records with uninitialized fields are created and those
+ fields have a declared type that is incompatible with
+ <c>'undefined'</c> (e.g. <c>float()</c>). This warning
+ can be suppressed easily by adding <c>| 'undefined'</c>
+ to the type of this field. This also adds documentation
+ that the user really intends to create records where this
+ field is uninitialized.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-12719</p>
+ </item>
+ <item>
+ <p> Remove deprecated functions in the modules
+ <c>erl_scan</c> and <c>erl_parse</c>. </p>
+ <p>
+ Own Id: OTP-12861</p>
+ </item>
+ <item>
+ <p>The pre-processor can now expand the ?FUNCTION_NAME
+ and ?FUNCTION_ARITY macros.</p>
+ <p>
+ Own Id: OTP-13059</p>
+ </item>
+ <item>
+ <p> A new behaviour <c>gen_statem</c> has been
+ implemented. It has been thoroughly reviewed, is stable
+ enough to be used by at least two heavy OTP applications,
+ and is here to stay. But depending on user feedback, we
+ do not expect but might find it necessary to make minor
+ not backwards compatible changes into OTP-20.0, so its
+ state can be designated as "not quite experimental"...
+ </p> <p> The <c>gen_statem</c> behaviour is intended to
+ replace <c>gen_fsm</c> for new code. It has the same
+ features and add some really useful: </p> <list
+ type="bulleted"> <item>State code is gathered</item>
+ <item>The state can be any term</item> <item>Events can
+ be postponed</item> <item>Events can be self
+ generated</item> <item>A reply can be sent from a later
+ state</item> <item>There can be multiple sys traceable
+ replies</item> </list> <p> The callback model(s) for
+ <c>gen_statem</c> differs from the one for
+ <c>gen_fsm</c>, but it is still fairly easy to rewrite
+ from <c>gen_fsm</c> to <c>gen_statem</c>. </p>
+ <p>
+ Own Id: OTP-13065 Aux Id: PR-960 </p>
+ </item>
+ <item>
+ <p>
+ Optimize binary:split/2 and binary:split/3 with native
+ BIF implementation.</p>
+ <p>
+ Own Id: OTP-13082</p>
+ </item>
+ <item>
+ <p>Background: The types of record fields have since R12B
+ been put in a separate form by <c>epp:parse_file()</c>,
+ leaving the record declaration form untyped. The separate
+ form, however, does not follow the syntax of type
+ declarations, and parse transforms inspecting
+ <c>-type()</c> attributes need to know about the special
+ syntax. Since the compiler stores the return value of
+ <c>epp:parse_file()</c> as debug information in the
+ abstract code chunk (<c>"Abst"</c> or
+ <c>abstract_code</c>), tools too need to know about the
+ special syntax, if they inspect <c>-type()</c> attributes
+ in abstract code.</p>
+ <p>Change: No separate type form is created by
+ <c>epp:parse_file()</c>, but the type information is kept
+ in the record fields. This means that all parse
+ transforms and all tools inspecting <c>-record()</c>
+ declarations need to recognize <c>{typed_record_field,
+ Field, Type}</c>.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13148</p>
+ </item>
+ <item>
+ <p>
+ Unsized fields of the type <c>bytes</c> in binary
+ generators are now forbidden. (The other ways of writing
+ unsized fields, such as <c>binary</c>, are already
+ forbidden.)</p>
+ <p>
+ Own Id: OTP-13152</p>
+ </item>
+ <item>
+ <p> The type <c>map()</c> is built-in, and cannot be
+ redefined. </p>
+ <p>
+ Own Id: OTP-13153</p>
+ </item>
+ <item>
+ <p> Let <c>dets:open_file()</c> exit with a <c>badarg</c>
+ message if given a raw file name (a binary). </p>
+ <p>
+ Own Id: OTP-13229 Aux Id: ERL-55 </p>
+ </item>
+ <item>
+ <p> Add <c>filename:basedir/2,3</c></p> <p>basedir
+ returns suitable path(s) for 'user_cache', 'user_config',
+ 'user_data', 'user_log', 'site_config' and 'site_data'.
+ On linux and linux like systems the paths will respect
+ the XDG environment variables.</p>
+ <p>
+ Own Id: OTP-13392</p>
+ </item>
+ <item>
+ <p>There are new preprocessor directives
+ <c>-error(Term)</c> and <c>-warning(Term)</c> to cause a
+ compilation error or a compilation warning,
+ respectively.</p>
+ <p>
+ Own Id: OTP-13476</p>
+ </item>
+ <item>
+ <p>
+ Optimize <c>'++'</c> operator and <c>lists:append/2</c>
+ by using a single pass to build a new list while checking
+ for properness.</p>
+ <p>
+ Own Id: OTP-13487</p>
+ </item>
+ <item>
+ <p>
+ Add <c>maps:update_with/3,4</c> and <c>maps:take/2</c></p>
+ <p>
+ Own Id: OTP-13522 Aux Id: PR-1025 </p>
+ </item>
+ <item>
+ <p><c>lists:join/2</c> has been added. Similar to
+ <c>string:join/2</c> but works with arbitrary lists.</p>
+ <p>
+ Own Id: OTP-13523</p>
+ </item>
+ <item>
+ <p>Obfuscate asserts to make Dialyzer shut up.</p>
+ <p>
+ Own Id: OTP-13524 Aux Id: PR-1002 </p>
+ </item>
+ <item>
+ <p>
+ Supervisors now explicitly add their callback module in
+ the return from sys:get_status/1,2. This is to simplify
+ custom supervisor implementations. The Misc part of the
+ return value from sys:get_status/1,2 for a supervisor is
+ now:</p>
+ <p>
+ [{data, [{"State",
+ State}]},{supervisor,[{"Callback",Module}]}]</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13619 Aux Id: PR-1000 </p>
+ </item>
+ <item>
+ <p>
+ Relax translation of initial calls in <c>proc_lib</c>,
+ i.e. remove the restriction to only do the translation
+ for <c>gen_server</c> and <c>gen_fsm</c>. This enables
+ user defined <c>gen</c> based generic callback modules to
+ be displayed nicely in <c>c:i()</c> and observer.</p>
+ <p>
+ Own Id: OTP-13623</p>
+ </item>
+ <item>
+ <p>The function <c>queue:lait/1</c> (misspelling of
+ <c>liat/1</c>) is now deprecated.</p>
+ <p>
+ Own Id: OTP-13658</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>STDLIB 2.8</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/syntax_tools/doc/src/notes.xml b/lib/syntax_tools/doc/src/notes.xml
index 78b2c7c7a4..ef207f7c3d 100644
--- a/lib/syntax_tools/doc/src/notes.xml
+++ b/lib/syntax_tools/doc/src/notes.xml
@@ -32,6 +32,32 @@
<p>This document describes the changes made to the Syntax_Tools
application.</p>
+<section><title>Syntax_Tools 2.0</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>The abstract data type in <c>erl_syntax</c> is
+ augmented with types and function specifications.</p>
+ <p>The module <c>erl_prettypr</c> pretty prints types and
+ function specification, and the output can be parsed.</p>
+ <p>The types of record fields are no longer ignored. As a
+ consequence <c>erl_syntax_lib:analyze_record_field/1</c>
+ returns <c>{Default, Type}</c> instead of <c>Default</c>.
+ The functions <c>analyze_record_attribute</c>,
+ <c>analyze_attribute</c>, <c>analyze_form</c>, and
+ <c>analyze_forms</c> in the <c>erl_syntax_lib</c> module
+ are also affected by this incompatible change.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-12863</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Syntax_Tools 1.7</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/tools/doc/src/notes.xml b/lib/tools/doc/src/notes.xml
index 3a6ac37eef..0b8a2be715 100644
--- a/lib/tools/doc/src/notes.xml
+++ b/lib/tools/doc/src/notes.xml
@@ -31,6 +31,41 @@
</header>
<p>This document describes the changes made to the Tools application.</p>
+<section><title>Tools 2.8.4</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Update fprof to use the new 'spawned' trace event to
+ determine when a process has been created.</p>
+ <p>
+ Own Id: OTP-13499</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>Optimize adding multiple modules to an Xref server.
+ </p>
+ <p>
+ Own Id: OTP-13593</p>
+ </item>
+ <item>
+ <p>
+ Various emacs mode improvements, such as better tags
+ support.</p>
+ <p>
+ Own Id: OTP-13610</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Tools 2.8.3</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/tools/vsn.mk b/lib/tools/vsn.mk
index 70564f05c6..8c889cbe4e 100644
--- a/lib/tools/vsn.mk
+++ b/lib/tools/vsn.mk
@@ -1 +1 @@
-TOOLS_VSN = 2.8.3
+TOOLS_VSN = 2.8.4
diff --git a/lib/typer/doc/src/notes.xml b/lib/typer/doc/src/notes.xml
index d6d545d0e4..9ef5ca1c70 100644
--- a/lib/typer/doc/src/notes.xml
+++ b/lib/typer/doc/src/notes.xml
@@ -31,6 +31,21 @@
</header>
<p>This document describes the changes made to TypEr.</p>
+<section><title>TypEr 0.9.11</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>TypEr 0.9.10</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/typer/vsn.mk b/lib/typer/vsn.mk
index 507593ef56..ed12e067c1 100644
--- a/lib/typer/vsn.mk
+++ b/lib/typer/vsn.mk
@@ -1 +1 @@
-TYPER_VSN = 0.9.10
+TYPER_VSN = 0.9.11
diff --git a/lib/wx/doc/src/notes.xml b/lib/wx/doc/src/notes.xml
index c7400206ab..4f0e166924 100644
--- a/lib/wx/doc/src/notes.xml
+++ b/lib/wx/doc/src/notes.xml
@@ -32,6 +32,43 @@
<p>This document describes the changes made to the wxErlang
application.</p>
+<section><title>Wx 1.7</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Fixed bugs which could cause called functions to be
+ invoked twice or not at all when callbacks where invoked
+ at the same time.</p>
+ <p>
+ Own Id: OTP-13491</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Changed atom 'boolean' fields in #wxMouseState{} to
+ 'boolean()'.</p>
+ <p>
+ Moved out arguments in wxListCtrl:hitTest to result.</p>
+ <p>
+ Removed no-op functions in wxGauge that have been removed
+ from wxWidgets-3.1.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-13553</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Wx 1.6.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/wx/vsn.mk b/lib/wx/vsn.mk
index de723b2a2d..de4e5e1935 100644
--- a/lib/wx/vsn.mk
+++ b/lib/wx/vsn.mk
@@ -1 +1 @@
-WX_VSN = 1.6.1
+WX_VSN = 1.7
diff --git a/lib/xmerl/doc/src/notes.xml b/lib/xmerl/doc/src/notes.xml
index 4f61d4b52c..0abcb87998 100644
--- a/lib/xmerl/doc/src/notes.xml
+++ b/lib/xmerl/doc/src/notes.xml
@@ -32,6 +32,21 @@
<p>This document describes the changes made to the Xmerl application.</p>
+<section><title>Xmerl 1.3.11</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Internal changes</p>
+ <p>
+ Own Id: OTP-13551</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Xmerl 1.3.10</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/xmerl/vsn.mk b/lib/xmerl/vsn.mk
index 09d81e0533..a78a035a1f 100644
--- a/lib/xmerl/vsn.mk
+++ b/lib/xmerl/vsn.mk
@@ -1 +1 @@
-XMERL_VSN = 1.3.10
+XMERL_VSN = 1.3.11
diff --git a/otp_versions.table b/otp_versions.table
index af476841ab..9e7919e515 100644
--- a/otp_versions.table
+++ b/otp_versions.table
@@ -1,3 +1,5 @@
+OTP-19.0 : asn1-4.0.3 common_test-1.12.2 compiler-7.0 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7 debugger-4.2 dialyzer-3.0 diameter-1.12 edoc-0.7.19 eldap-1.2.2 erl_docgen-0.5 erl_interface-3.9 erts-8.0 et-1.6 eunit-2.3 gs-1.6.1 hipe-3.15.1 ic-4.4.1 inets-6.3 jinterface-1.7 kernel-5.0 megaco-3.18.1 mnesia-4.14 observer-2.2 odbc-2.11.2 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.2 percept-0.9 public_key-1.2 reltool-0.7.1 runtime_tools-1.10 sasl-3.0 snmp-5.2.3 ssh-4.3 ssl-8.0 stdlib-3.0 syntax_tools-2.0 tools-2.8.4 typer-0.9.11 wx-1.7 xmerl-1.3.11 # :
+OTP-18.3.4.1 : ssh-4.2.2.1 # asn1-4.0.2 common_test-1.12.1 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 inets-6.2.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssl-7.3.3 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 :
OTP-18.3.4 : inets-6.2.4 ssl-7.3.3 # asn1-4.0.2 common_test-1.12.1 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 :
OTP-18.3.3 : common_test-1.12.1 inets-6.2.3 ssl-7.3.2 # asn1-4.0.2 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 :
OTP-18.3.2 : inets-6.2.2 ssl-7.3.1 # asn1-4.0.2 common_test-1.12 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 :
diff --git a/system/doc/top/templates/index.html.src b/system/doc/top/templates/index.html.src
index 2ece44b15f..d2a6736d34 100644
--- a/system/doc/top/templates/index.html.src
+++ b/system/doc/top/templates/index.html.src
@@ -108,7 +108,7 @@ In addition to the documentation here Erlang is described in several recent book
<a href="http://shop.oreilly.com/product/0636920025818.do">"Introducing Erlang"</a> from O'Reilly.
</li>
<li>
-<a href="http://www.nostarch.com/erlang">"Learn You Some Erlang for Great Good!"</a> from nostarch.
+<a href="http://www.nostarch.com/erlang">"Learn You Some Erlang for Great Good!"</a> from No Starch Press.
</li>
<li>
<a href="http://oreilly.com/catalog/9780596518189">"Erlang Programming"</a> from O'Reilly.
@@ -119,6 +119,9 @@ In addition to the documentation here Erlang is described in several recent book
<li>
<a href="http://www.manning.com/logan">"Erlang and OTP in Action"</a> from Manning.
</li>
+<li>
+<a href="http://shop.oreilly.com/product/0636920024149.do">"Designing for Scalability with Erlang/OTP"</a> from O'Reilly.
+</li>
</ul>
<p>
These books are highly recommended as a start for learning Erlang.
@@ -129,14 +132,15 @@ href="applications.html">applications</a>. An application normally contains
Erlang <a href="man_index.html">modules</a>. Some OTP applications,
such as the C interface <em>erl_interface</em>, are written in other languages and have no Erlang
modules.
+<p></p>
+</li>
-<p>
<li>On a Unix system you can view the manual pages from the command
line using
<pre>
% erl -man &lt;module&gt;
</pre>
-<p>
+</li>
<li> You can of course use any editor you like to write Erlang
programs, but if you use Emacs there exists editing support such as
@@ -161,23 +165,27 @@ module and function name completion (tab) if the module is loaded.
<li>OpenSource users can ask questions
and share experiences on the <a href="http://www.erlang.org/static/doc/mailinglist.html">
-Erlang questions mailing list</a>. <p>
+Erlang questions mailing list</a>.
+<p></p>
+</li>
<li>Before asking a question you can browse the <a
href="http://www.erlang.org/pipermail/erlang-questions/">
mailing list archive</a> and read the <a
href="http://www.erlang.org/faq/faq.html" >Frequently
-Asked Questions</a>. <p>
+Asked Questions</a>.
+<p></p>
+</li>
<li>Additional information and links of interest for Erlang programmers can be found on the Erlang Open Source site
<a href="http://www.erlang.org/">http://www.erlang.org</a>.
-<p>
+</li>
</ul>
<center>
<small>
-Copyright &copy; 1999-2013
+Copyright &copy; 1999-2016
<a href="http://www.ericsson.com">Ericsson AB</a>
</small>
</center>