| Patch Package | OTP 28.3 |
| Git Tag | OTP-28.3 |
| Date | 2025-12-10 |
| Issue Id |
ERIERL-1251
|
| System | OTP |
| Release | 28 |
| Application | |
| Potential Incompatibilities |
Highlights #
- OTP-19767
-
- Application(s):
- ssl
- Related Id(s):
Add support for MLKEM hybrid algorithms x25519mlkem768, secp384r1mlkem1024, secp256r1mlkem768 in TLS-1.3
- OTP-19857
-
- Application(s):
- erts, kernel
- Related Id(s):
-
PR-10390, OTP-19814
Support for the socket options TCP_KEEPCNT, TCP_KEEPIDLE, and TCP_KEEPINTVL have been implemented for
gen_tcp, as well as TCP_USER_TIMEOUT for bothgen_tcpandsocket. - OTP-19867
-
- Application(s):
- public_key, ssl
- Related Id(s):
Add support in public_key and ssl for post quantum algorithm SLH-DSA.
- OTP-19878
-
Publish OpenVEX statements in https://erlang.org/download/vex/
OpenVEX statements contain the same information as the OTP advisories, with the addition of vendor CVEs for which Erlang/OTP is not affected. This is important to silence vulnerability scanners that may claim Erlang/OTP to be vulnerable to vendor dependency projects, e.g.,
openssl.OpenVEX statements will be published in https://erlang.org/download/vex/ where there will be an OTP file per release, e.g., https://erlang.org/download/vex/otp-28.openvex.json.
Erlang/OTP publishes OpenVEX statements for all supported releases, that is, as of today, OTP-26, OTP-27, and OTP-28.
The source SBOM tooling (oss-review-toolkit) has been updated to produce source SBOM in SPDX v2.3 format, and the source SBOM now links OpenVEX statements to a security external reference. This means that by simply analyzing the source SBOM, everyone can further read the location of the OpenVEX statements and further process them.
OTP-28.3 #
- OTP-19877
-
- Related Id(s):
-
ERIERL-1251, PR-10410
Broken sidebar application index, for all OTP applications, are restored.
- OTP-19777
-
- Related Id(s):
Updated the vendor dependencies SHA to improve the accuracy of the source SBOM with
purlpointing to the exact vendor commit that Erlang/OTP builds upon. - OTP-19802
-
OpenVEX statements has been added to rule out false positives on vendor dependencies: CVE-2025-9230, CVE-2025-9231, CVE-2025-9232
- OTP-19808
-
- Related Id(s):
The
mnesia_registrymodule will be removed in Erlang/OTP 29. - OTP-19878
-
- HIGHLIGHT
Publish OpenVEX statements in https://erlang.org/download/vex/
OpenVEX statements contain the same information as the OTP advisories, with the addition of vendor CVEs for which Erlang/OTP is not affected. This is important to silence vulnerability scanners that may claim Erlang/OTP to be vulnerable to vendor dependency projects, e.g.,
openssl.OpenVEX statements will be published in https://erlang.org/download/vex/ where there will be an OTP file per release, e.g., https://erlang.org/download/vex/otp-28.openvex.json.
Erlang/OTP publishes OpenVEX statements for all supported releases, that is, as of today, OTP-26, OTP-27, and OTP-28.
The source SBOM tooling (oss-review-toolkit) has been updated to produce source SBOM in SPDX v2.3 format, and the source SBOM now links OpenVEX statements to a security external reference. This means that by simply analyzing the source SBOM, everyone can further read the location of the OpenVEX statements and further process them.
common_test-1.29.1 #
The common_test-1.29.1 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19777
-
- Related Id(s):
Updated the vendor dependencies SHA to improve the accuracy of the source SBOM with
purlpointing to the exact vendor commit that Erlang/OTP builds upon.
Full runtime dependencies of common_test-1.29.1
compiler-6.0, crypto-4.5, debugger-4.1, erts-7.0, ftp-1.0, inets-6.0, kernel-8.4, observer-2.1, runtime_tools-1.8.16, sasl-2.5, snmp-5.1.2, ssh-4.0, stdlib-4.0, syntax_tools-1.7, tools-3.2, xmerl-1.3.8
compiler-9.0.4 #
The compiler-9.0.4 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19797
-
- Related Id(s):
For some function heads or
caseexpressions with a huge number of clauses, the compiler could spend an inordinate amount of time compiling the code. - OTP-19821
-
Passing a type for a fun as a macro argument would result in a “badly formed argument” error message from the compiler. Example:
-module(test). -define(FOO(X), X). -type foo() :: ?FOO(fun(() -> ok)).Compiling this module would result in the following error message:
test.erl:3:17: badly formed argument for macro 'FOO' % 5| -type foo() :: ?FOO(fun(() -> ok)). % - OTP-19879
-
In certain edge cases, the compiler could emit code that would do an unsafe destructive update of a tuple. This has been corrected.
- OTP-19854
-
- Related Id(s):
The compiler option
beam_debug_stackcombined withbeam_debug_infowill attempt to make as many variables as possible visible in the debugger. The option has no effect if given withoutbeam_debug_info.
Full runtime dependencies of compiler-9.0.4
crypto-5.1, erts-13.0, kernel-8.4, stdlib-6.0
crypto-5.8 #
The crypto-5.8 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19841
-
- Related Id(s):
The deprecated function
crypto:rand_uniform/2has gotten a new replacement functioncrypto:strong_rand_range/1. When implementing this the documentation ofcryptoandrandhas been rewritten a bit and improved. - OTP-19848
-
You can now build OTP with OpenSSL 3.5 or later on windows.
- OTP-19856
-
- Related Id(s):
Added SLH-DSA algorithms for sign/verify. Twelve variants supported in total; all combinations of SHAKE or SHA2 hashing, with 128, 192 or 256 bits, and fast(
f) or small(s). - OTP-19872
-
- Related Id(s):
Made
crypto:generate_key(dh, [P, G, MaxPrivateKeyBitLength])accept values ofMaxPrivateKeyBitLengthto be equal or larger than the bit length ofP. If so, the maximum bit length is adjusted down toP’s bit length minus one.
Full runtime dependencies of crypto-5.8
erts-9.0, kernel-6.0, stdlib-3.9
diameter-2.6 #
erl_interface-5.6.2 #
The erl_interface-5.6.2 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19777
-
- Related Id(s):
Updated the vendor dependencies SHA to improve the accuracy of the source SBOM with
purlpointing to the exact vendor commit that Erlang/OTP builds upon. - OTP-19870
-
- Related Id(s):
Updated MD5 implementation from OpenSSL 3.5.0 to 3.6.0
- OTP-16607
-
- Related Id(s):
-
OTP-16608
The
eiAPI for decoding/encoding terms is not fully 64-bit compatible since terms that have a representation on the external term format larger than 2 GB cannot be handled.
erts-16.2 #
The erts-16.2 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19789
-
- Related Id(s):
Fixed a build issue on modern compilers.
- OTP-19803
-
- Related Id(s):
When multiple processes called the same fun whose defining module was not loaded, a
badfunexception could sometimes occur in one of the calling processes. This would only happen with the JIT runtime system. - OTP-19819
-
- Related Id(s):
Fix a bug where Erlang/OTP tools could load a different boot script from CWD.
- OTP-19840
-
- Related Id(s):
Fixed a bug when more than one session traced the same BIF. Disabling tracing for a BIF in one session could incorrectly disable tracing of the BIF in other trace sessions as well.
- OTP-19859
-
Fixed a slight performance regression in
erlang:binary_to_term/1,2. - OTP-19862
-
Two socket related code warts found by PVS Studio has been fixed. One caused
gen_tcpto no convert the send erroreconnabortedtoeconnreseton Windows. The other causedsocket:sendfile/*to indicate the wrong error for a badOffset. - OTP-19888
-
Fixed bug causing VM crash if an Erlang process gets killed while executing
re:runwith a (presumably) large subject string. - OTP-19777
-
- Related Id(s):
Updated the vendor dependencies SHA to improve the accuracy of the source SBOM with
purlpointing to the exact vendor commit that Erlang/OTP builds upon. - OTP-19794
-
- Related Id(s):
Receive buffer allocation has been optimized for
socketsocket in that an underutilized buffers’ content is copied to a freshly allocated binary of the right size instead of being reallocated.This optimization was already implemented for the
socket:recv/1functions, but now the same buffer stragegy is shared between allsocketreceive operations. - OTP-19814
-
Option(s) to create
gen_tcpandsocketsockets with protocol IPPROTO_MPTCP has been implemented.See functions
gen_tcp:listen/2,gen_tcp:connect/4and the typesocket:protocol/0. - OTP-19852
-
- Related Id(s):
erlcwill now limit the number of ports and processes when startingerlin order to use less memory. - OTP-19857
-
- HIGHLIGHT
Support for the socket options TCP_KEEPCNT, TCP_KEEPIDLE, and TCP_KEEPINTVL have been implemented for
gen_tcp, as well as TCP_USER_TIMEOUT for bothgen_tcpandsocket. - OTP-19863
-
- Related Id(s):
Limit size of sctp_event_subscribe on Linux
- OTP-19870
-
- Related Id(s):
Updated MD5 implementation from OpenSSL 3.5.0 to 3.6.0
- OTP-19873
-
Improved performance when doing
socket:accepton the same socket from many processes on large multi core systems under high rate of connections. Mitigating performance regression seen since OTP 28.0. - OTP-19876
-
Updated STL version used.
- OTP-19880
-
- Related Id(s):
Updated PCRE2 to 10.47. Also picked newer fix, from upstream PCRE2, to bug that could cause benign random uninitialized data in exported regular expressions.
Full runtime dependencies of erts-16.2
kernel-9.0, sasl-3.3, stdlib-4.1
eunit-2.10.1 #
The eunit-2.10.1 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19738
-
- Related Id(s):
The usages of deprecated slave module have been removed from the application. The fixture clause for spawning a test node now accepts Args either as a string or a list of strings (previously only a string was accepted).
Full runtime dependencies of eunit-2.10.1
erts-9.0, kernel-5.3, stdlib-6.0
inets-9.5 #
The inets-9.5 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19835
-
- Related Id(s):
Fixed uri_string:uri_string() to string() type specs inside httpc.erl module.
- OTP-19875
-
Fixed a bug where request options were not applied to a https proxy connection.
- OTP-19717
-
- Related Id(s):
The usages of slave module in inets were removed. The httpd_bench_suite has been updated for SSL testing and is not skipped anymore. The httpd_load_test example has been removed completely as outdated.
- OTP-19884
-
Replace a call to application:which_applications() in httpc:set_options/2 with try…catch to reduce bottleneck.
Full runtime dependencies of inets-9.5
erts-14.0, kernel-9.0, mnesia-4.12, public_key-1.13, runtime_tools-1.8.14, ssl-9.0, stdlib-5.0, stdlib-6.0
kernel-10.5 #
The kernel-10.5 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19812
-
- Related Id(s):
Fixed a shell crash when calling io:getopts() when user_drv process is not responding/terminating
- OTP-19837
-
logger:get_handler_config/0will no longer crash if a logger handler is removed concurrently with that call. - OTP-19847
-
- Related Id(s):
Fixed a bug in the shell that made it incorrectly output a newline after the output already containing a newline but followed by an asci escape sequence.
- OTP-19794
-
- Related Id(s):
Receive buffer allocation has been optimized for
socketsocket in that an underutilized buffers’ content is copied to a freshly allocated binary of the right size instead of being reallocated.This optimization was already implemented for the
socket:recv/1functions, but now the same buffer stragegy is shared between allsocketreceive operations. - OTP-19814
-
Option(s) to create
gen_tcpandsocketsockets with protocol IPPROTO_MPTCP has been implemented.See functions
gen_tcp:listen/2,gen_tcp:connect/4and the typesocket:protocol/0. - OTP-19857
-
- HIGHLIGHT
Support for the socket options TCP_KEEPCNT, TCP_KEEPIDLE, and TCP_KEEPINTVL have been implemented for
gen_tcp, as well as TCP_USER_TIMEOUT for bothgen_tcpandsocket. - OTP-19863
-
- Related Id(s):
Limit size of sctp_event_subscribe on Linux
Full runtime dependencies of kernel-10.5
crypto-5.0, erts-15.2.5, sasl-3.0, stdlib-6.0
mnesia-4.25 #
The mnesia-4.25 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19769
-
- Related Id(s):
Add missing documentation about mnesia:activity/4
- OTP-19855
-
With this change mnesia will try to not leak internal messages to user processes.
- OTP-19808
-
- Related Id(s):
The
mnesia_registrymodule will be removed in Erlang/OTP 29.
Full runtime dependencies of mnesia-4.25
erts-9.0, kernel-5.3, stdlib-5.0
os_mon-2.11.2 #
public_key-1.20 #
Note! The public_key-1.20 application cannot be applied independently of other applications on an arbitrary OTP 28 installation.
On a full OTP 28 installation, also the following runtime
dependency has to be satisfied:
-- crypto-5.8 (first satisfied in OTP 28.3)
- OTP-19869
-
ASN.1 Encoding and decoding of some extensions did not work, e.g.
CRLEntryExtension. - OTP-19867
-
- HIGHLIGHT
Add support in public_key and ssl for post quantum algorithm SLH-DSA.
Full runtime dependencies of public_key-1.20
asn1-5.0, crypto-5.8, erts-13.0, kernel-8.0, stdlib-4.0
snmp-5.20 #
The snmp-5.20 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19883
-
- Related Id(s):
Fixed a bug where running snmp:config() from Elixir would crash due to io:get_line/1 returning unexpected datatype.
- OTP-19885
-
- Related Id(s):
Inherit ERL_DETERMINISTIC variable for compiling snmp_pdus_basic.beam.
Full runtime dependencies of snmp-5.20
asn1-5.4, crypto-4.6, erts-12.0, kernel-8.0, mnesia-4.12, runtime_tools-1.8.14, stdlib-5.0
ssh-5.4 #
The ssh-5.4 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19743
-
- POTENTIAL INCOMPATIBILITY
Adjustment in ssh_file module allowing inclusion of Erlang/OTP license in test files containing keys.
Full runtime dependencies of ssh-5.4
crypto-5.0, erts-14.0, kernel-10.3, public_key-1.6.1, runtime_tools-1.15.1, stdlib-5.0, stdlib-6.0
ssl-11.5 #
Note! The ssl-11.5 application cannot be applied independently of other applications on an arbitrary OTP 28 installation.
On a full OTP 28 installation, also the following runtime
dependencies have to be satisfied:
-- crypto-5.8 (first satisfied in OTP 28.3)
-- public_key-1.18.3 (first satisfied in OTP 28.1)
- OTP-19805
-
- Related Id(s):
Setting the internal process links between TLS distribution processes has been reviewed. In the TLS distribution test framework there were issues fixed, but probably not in the TLS distribution module.
- OTP-19828
-
- Related Id(s):
Correct documentation for fail_if_no_peer_cert option.
- OTP-19767
-
- HIGHLIGHT
Add support for MLKEM hybrid algorithms x25519mlkem768, secp384r1mlkem1024, secp256r1mlkem768 in TLS-1.3
- OTP-19829
-
- Related Id(s):
Property based test needed to compare raw handshakes, that is some utility decoding needs to be converted back.
- OTP-19867
-
- HIGHLIGHT
Add support in public_key and ssl for post quantum algorithm SLH-DSA.
Full runtime dependencies of ssl-11.5
crypto-5.8, erts-16.0, inets-5.10.7, kernel-10.3, public_key-1.18.3, runtime_tools-1.15.1, stdlib-7.0
stdlib-7.2 #
Note! The stdlib-7.2 application cannot be applied independently of other applications on an arbitrary OTP 28 installation.
On a full OTP 28 installation, also the following runtime
dependency has to be satisfied:
-- erts-16.0.3 (first satisfied in OTP 28.0.3)
- OTP-19066
-
- Related Id(s):
When creating a tar archive using
erl_tar, leading slashes would be kept for filenames with up to 100 characters. The slash would be dropped for longer filenames. This has been corrected to always keep the leading slash. - OTP-19797
-
- Related Id(s):
For some function heads or
caseexpressions with a huge number of clauses, the compiler could spend an inordinate amount of time compiling the code. - OTP-19821
-
Passing a type for a fun as a macro argument would result in a “badly formed argument” error message from the compiler. Example:
-module(test). -define(FOO(X), X). -type foo() :: ?FOO(fun(() -> ok)).Compiling this module would result in the following error message:
test.erl:3:17: badly formed argument for macro 'FOO' % 5| -type foo() :: ?FOO(fun(() -> ok)). % - OTP-19833
-
- Related Id(s):
Fixed an issue that prohibited the use of user defined functions within a restricted shell.
- OTP-19841
-
- Related Id(s):
The deprecated function
crypto:rand_uniform/2has gotten a new replacement functioncrypto:strong_rand_range/1. When implementing this the documentation ofcryptoandrandhas been rewritten a bit and improved. - OTP-19850
-
- Related Id(s):
Fixed a bug in the shell where a reference to a locally defined function would cause a crash.
- OTP-19787
-
- Related Id(s):
You are now able to read the reference manual with man.
- OTP-19798
-
- Related Id(s):
Improved spec for
ets:lookup_element/4. - OTP-19808
-
- Related Id(s):
The
mnesia_registrymodule will be removed in Erlang/OTP 29.
Full runtime dependencies of stdlib-7.2
compiler-5.0, crypto-4.5, erts-16.0.3, kernel-10.0, sasl-3.0, syntax_tools-3.2.1
wx-2.5.3 #
The wx-2.5.3 application can be applied independently of other applications on a full OTP 28 installation.
- OTP-19823
-
- Related Id(s):
Fix getting
wxImagepixel values. For example,wxImage:getRed(Image)returned the wrong value.Creating OpenGL windows should now work again.
- OTP-19843
-
- Related Id(s):
Fixed reading out of array bounds and potential memory leaks.
- OTP-19777
-
- Related Id(s):
Updated the vendor dependencies SHA to improve the accuracy of the source SBOM with
purlpointing to the exact vendor commit that Erlang/OTP builds upon.
Full runtime dependencies of wx-2.5.3
erts-12.0, kernel-8.0, stdlib-5.0
Thanks To #
Alexandre Rodrigues, Andrew Bennett, Anton Thomasson, Dmytro Lytovchenko, jakob svenningsson, João Henrique Ferreira de Freitas, Marcelino Alberdi Pereira, Maria Scott, Marko Mindek, Michael Neumann, Stavros Aronis, Sundeep Katepalli, Svilen Ivanov, Tom, Vladislav Grishenko, wallacegibbon