aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cirrus.yml2
-rw-r--r--crypto/openssl/CHANGES.md69
-rw-r--r--crypto/openssl/NEWS.md40
-rw-r--r--crypto/openssl/VERSION.dat4
-rw-r--r--crypto/openssl/apps/storeutl.c16
-rw-r--r--crypto/openssl/crypto/bio/bss_file.c2
-rw-r--r--crypto/openssl/crypto/ec/ecp_sm2p256.c2
-rw-r--r--crypto/openssl/crypto/evp/bio_ok.c27
-rw-r--r--crypto/openssl/crypto/evp/ctrl_params_translate.c2
-rw-r--r--crypto/openssl/crypto/evp/p_lib.c17
-rw-r--r--crypto/openssl/crypto/info.c14
-rw-r--r--crypto/openssl/crypto/ml_dsa/ml_dsa_key.c4
-rw-r--r--crypto/openssl/crypto/ml_kem/ml_kem.c2
-rw-r--r--crypto/openssl/crypto/modes/siv128.c3
-rw-r--r--crypto/openssl/crypto/property/property_parse.c2
-rw-r--r--crypto/openssl/crypto/rsa/rsa_gen.c15
-rw-r--r--crypto/openssl/crypto/rsa/rsa_sign.c4
-rw-r--r--crypto/openssl/crypto/threads_pthread.c12
-rw-r--r--crypto/openssl/crypto/x509/t_x509.c3
-rw-r--r--crypto/openssl/crypto/x509/x509_lu.c1
-rw-r--r--crypto/openssl/doc/man3/DEFINE_STACK_OF.pod19
-rw-r--r--crypto/openssl/doc/man3/OpenSSL_version.pod9
-rw-r--r--crypto/openssl/doc/man3/SSL_CIPHER_get_name.pod4
-rw-r--r--crypto/openssl/doc/man3/SSL_SESSION_get0_hostname.pod10
-rw-r--r--crypto/openssl/include/crypto/rsa.h4
-rw-r--r--crypto/openssl/include/openssl/opensslv.h.in4
-rw-r--r--crypto/openssl/providers/fips-sources.checksums20
-rw-r--r--crypto/openssl/providers/fips.checksum2
-rw-r--r--crypto/openssl/providers/fips/self_test_data.inc42
-rw-r--r--crypto/openssl/providers/fips/self_test_kats.c100
-rw-r--r--crypto/openssl/providers/implementations/kdfs/krb5kdf.c7
-rw-r--r--crypto/openssl/providers/implementations/keymgmt/ecx_kmgmt.c8
-rw-r--r--crypto/openssl/ssl/quic/quic_impl.c7
-rw-r--r--crypto/openssl/ssl/record/methods/tls_common.c11
-rw-r--r--crypto/openssl/ssl/ssl_rsa.c5
-rw-r--r--crypto/openssl/ssl/t1_trce.c4
-rw-r--r--crypto/openssl/test/build.info3
-rw-r--r--crypto/openssl/test/fake_rsaprov.c4
-rw-r--r--crypto/openssl/test/fake_rsaprov.h11
-rw-r--r--crypto/openssl/test/ml_kem_evp_extra_test.c10
-rw-r--r--crypto/openssl/test/property_test.c19
-rw-r--r--crypto/openssl/test/provider_pkey_test.c72
-rw-r--r--crypto/openssl/test/quicapitest.c95
-rw-r--r--crypto/openssl/test/radix/terp.c6
-rw-r--r--crypto/openssl/test/recipes/03-test_fipsinstall.t12
-rw-r--r--crypto/openssl/test/recipes/25-test_verify.t5
-rw-r--r--crypto/openssl/test/recipes/30-test_evp_data/evpkdf_krb5.txt10
-rw-r--r--crypto/openssl/test/recipes/30-test_evp_data/evppkey_rsa_sigalg.txt4
-rw-r--r--crypto/openssl/test/recipes/90-test_sslapi.t17
-rw-r--r--crypto/openssl/test/recipes/90-test_sslapi_data/ssltraceref-zlib.txt255
-rw-r--r--crypto/openssl/test/recipes/90-test_sslapi_data/ssltraceref.txt253
-rw-r--r--crypto/openssl/test/sslapitest.c87
-rw-r--r--crypto/openssl/test/testutil.h2
-rw-r--r--crypto/openssl/test/testutil/compare.c88
-rw-r--r--crypto/openssl/test/threadstest.c11
-rw-r--r--crypto/openssl/test/wpackettest.c2
-rw-r--r--include/resolv.h4
-rw-r--r--lib/libc/Makefile1
-rw-r--r--lib/libc/gen/fts.351
-rw-r--r--lib/libc/include/port_before.h1
-rw-r--r--lib/libc/md/Makefile.inc3
-rw-r--r--lib/libc/resolv/Symbol.map1
-rw-r--r--lib/libc/resolv/res_init.c61
-rw-r--r--libexec/flua/Makefile2
-rw-r--r--libexec/flua/linit_flua.c3
-rw-r--r--libexec/flua/lposix/Makefile5
-rw-r--r--libexec/flua/lposix/Makefile.inc2
-rw-r--r--libexec/flua/modules/lposix.c (renamed from libexec/flua/lposix/lposix.c)5
-rw-r--r--libexec/flua/modules/lposix.h (renamed from libexec/flua/lposix/lposix.h)0
-rwxr-xr-xlibexec/nuageinit/nuageinit1
-rw-r--r--release/Makefile.mirrors2
-rwxr-xr-xrelease/scripts/make-pkg-package.sh7
-rw-r--r--release/tools/vagrant.conf25
-rw-r--r--share/man/man4/ice.496
-rw-r--r--sys/dev/acpica/acpi_apei.c2
-rw-r--r--sys/dev/pci/pci.c10
-rw-r--r--sys/dev/vmware/vmxnet3/if_vmx.c7
-rw-r--r--tools/test/stress2/misc/all.exclude6
-rwxr-xr-xtools/test/stress2/misc/fuzz.sh6
-rwxr-xr-xtools/test/stress2/misc/syzkaller84.sh402
-rwxr-xr-xtools/test/stress2/misc/syzkaller85.sh499
-rwxr-xr-xtools/test/stress2/misc/syzkaller86.sh555
-rw-r--r--usr.sbin/bsdinstall/bsdinstall.819
83 files changed, 2860 insertions, 379 deletions
diff --git a/.cirrus.yml b/.cirrus.yml
index e62b172efea9..b5c96820c192 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -4,7 +4,7 @@ compute_engine_instance:
# gcloud compute images list --project freebsd-org-cloud-dev --no-standard-images
platform: freebsd
image_project: freebsd-org-cloud-dev
- image: freebsd-14-2-release-amd64-ufs
+ image: freebsd-14-3-release-amd64-ufs
cpu: 8
memory: 8G
disk: 40
diff --git a/crypto/openssl/CHANGES.md b/crypto/openssl/CHANGES.md
index 5f5ba3ef1751..b991285aedb2 100644
--- a/crypto/openssl/CHANGES.md
+++ b/crypto/openssl/CHANGES.md
@@ -28,6 +28,72 @@ OpenSSL Releases
OpenSSL 3.5
-----------
+### Changes between 3.5.3 and 3.5.4 [30 Sep 2025]
+
+ * Fix Out-of-bounds read & write in RFC 3211 KEK Unwrap
+
+ Issue summary: An application trying to decrypt CMS messages encrypted using
+ password based encryption can trigger an out-of-bounds read and write.
+
+ Impact summary: This out-of-bounds read may trigger a crash which leads to
+ Denial of Service for an application. The out-of-bounds write can cause
+ a memory corruption which can have various consequences including
+ a Denial of Service or Execution of attacker-supplied code.
+
+ The issue was reported by Stanislav Fort (Aisle Research).
+
+ ([CVE-2025-9230])
+
+ *Viktor Dukhovni*
+
+ * Fix Timing side-channel in SM2 algorithm on 64 bit ARM
+
+ Issue summary: A timing side-channel which could potentially allow remote
+ recovery of the private key exists in the SM2 algorithm implementation on
+ 64 bit ARM platforms.
+
+ Impact summary: A timing side-channel in SM2 signature computations on
+ 64 bit ARM platforms could allow recovering the private key by an attacker.
+
+ The issue was reported by Stanislav Fort (Aisle Research).
+
+ ([CVE-2025-9231])
+
+ *Stanislav Fort and Tomáš Mráz*
+
+ * Fix Out-of-bounds read in HTTP client no_proxy handling
+
+ Issue summary: An application using the OpenSSL HTTP client API functions
+ may trigger an out-of-bounds read if the "no_proxy" environment variable is
+ set and the host portion of the authority component of the HTTP URL is an
+ IPv6 address.
+
+ Impact summary: An out-of-bounds read can trigger a crash which leads to
+ Denial of Service for an application.
+
+ The issue was reported by Stanislav Fort (Aisle Research).
+
+ ([CVE-2025-9232])
+
+ *Stanislav Fort*
+
+ * The FIPS provider no longer performs a PCT on key import for ECX keys
+ (that was introduced in 3.5.2), following the latest update
+ on that requirement in FIPS 140-3 IG 10.3.A additional comment 1.
+
+ *Eugene Syromiatnikov*
+
+ * Fixed the length of the ASN.1 sequence for the SM3 digests of RSA-encrypted
+ signatures.
+
+ *Xiao Lou Dong Feng*
+
+ * Reverted the synthesised `OPENSSL_VERSION_NUMBER` change for the release
+ builds, as it broke some exiting applications that relied on the previous
+ 3.x semantics, as documented in `OpenSSL_version(3)`.
+
+ *Richard Levitte*
+
### Changes between 3.5.2 and 3.5.3 [16 Sep 2025]
* Avoided a potential race condition introduced in 3.5.1, where
@@ -21284,6 +21350,9 @@ ndif
<!-- Links -->
+[CVE-2025-9232]: https://www.openssl.org/news/vulnerabilities.html#CVE-2025-9232
+[CVE-2025-9231]: https://www.openssl.org/news/vulnerabilities.html#CVE-2025-9231
+[CVE-2025-9230]: https://www.openssl.org/news/vulnerabilities.html#CVE-2025-9230
[CVE-2025-4575]: https://www.openssl.org/news/vulnerabilities.html#CVE-2025-4575
[CVE-2024-13176]: https://www.openssl.org/news/vulnerabilities.html#CVE-2024-13176
[CVE-2024-9143]: https://www.openssl.org/news/vulnerabilities.html#CVE-2024-9143
diff --git a/crypto/openssl/NEWS.md b/crypto/openssl/NEWS.md
index 5d8a83f43068..b194dfb7cb06 100644
--- a/crypto/openssl/NEWS.md
+++ b/crypto/openssl/NEWS.md
@@ -23,19 +23,46 @@ OpenSSL Releases
OpenSSL 3.5
-----------
+### Major changes between OpenSSL 3.5.3 and OpenSSL 3.5.4 [30 Sep 2025]
+
+OpenSSL 3.5.4 is a security patch release. The most severe CVE fixed in this
+release is Moderate.
+
+This release incorporates the following bug fixes and mitigations:
+
+ * Fix Out-of-bounds read & write in RFC 3211 KEK Unwrap.
+ ([CVE-2025-9230])
+
+ * Fix Timing side-channel in SM2 algorithm on 64 bit ARM.
+ ([CVE-2025-9231])
+
+ * Fix Out-of-bounds read in HTTP client no_proxy handling.
+ ([CVE-2025-9232])
+
+ * Reverted the synthesised `OPENSSL_VERSION_NUMBER` change for the release
+ builds, as it broke some exiting applications that relied on the previous
+ 3.x semantics, as documented in `OpenSSL_version(3)`.
+
### Major changes between OpenSSL 3.5.2 and OpenSSL 3.5.3 [16 Sep 2025]
- * Added FIPS 140-3 PCT on DH key generation.
+OpenSSL 3.5.3 is a bug fix release.
+
+This release incorporates the following bug fixes and mitigations:
- *Nikola Pajkovsky*
+ * Added FIPS 140-3 PCT on DH key generation.
* Fixed the synthesised `OPENSSL_VERSION_NUMBER`.
- *Richard Levitte*
+ * Removed PCT on key import in the FIPS provider as it is not required by
+ the standard.
### Major changes between OpenSSL 3.5.1 and OpenSSL 3.5.2 [5 Aug 2025]
- * none
+OpenSSL 3.5.2 is a bug fix release.
+
+This release incorporates the following bug fixes and mitigations:
+
+ * The FIPS provider now performs a PCT on key import for RSA, EC and ECX.
### Major changes between OpenSSL 3.5.0 and OpenSSL 3.5.1 [1 Jul 2025]
@@ -45,7 +72,7 @@ release is Low.
This release incorporates the following bug fixes and mitigations:
* Fix x509 application adds trusted use instead of rejected use.
- ([CVE-2025-4575])
+ ([CVE-2025-4575])
### Major changes between OpenSSL 3.4 and OpenSSL 3.5.0 [8 Apr 2025]
@@ -1913,6 +1940,9 @@ OpenSSL 0.9.x
* Support for various new platforms
<!-- Links -->
+[CVE-2025-9232]: https://www.openssl.org/news/vulnerabilities.html#CVE-2025-9232
+[CVE-2025-9231]: https://www.openssl.org/news/vulnerabilities.html#CVE-2025-9231
+[CVE-2025-9230]: https://www.openssl.org/news/vulnerabilities.html#CVE-2025-9230
[CVE-2025-4575]: https://www.openssl.org/news/vulnerabilities.html#CVE-2025-4575
[CVE-2024-13176]: https://www.openssl.org/news/vulnerabilities.html#CVE-2024-13176
[CVE-2024-9143]: https://www.openssl.org/news/vulnerabilities.html#CVE-2024-9143
diff --git a/crypto/openssl/VERSION.dat b/crypto/openssl/VERSION.dat
index 8a2893b68006..a8eb3ac9c421 100644
--- a/crypto/openssl/VERSION.dat
+++ b/crypto/openssl/VERSION.dat
@@ -1,7 +1,7 @@
MAJOR=3
MINOR=5
-PATCH=3
+PATCH=4
PRE_RELEASE_TAG=
BUILD_METADATA=
-RELEASE_DATE="16 Sep 2025"
+RELEASE_DATE="30 Sep 2025"
SHLIB_VERSION=3
diff --git a/crypto/openssl/apps/storeutl.c b/crypto/openssl/apps/storeutl.c
index 62f0e6135640..f8ebde44481c 100644
--- a/crypto/openssl/apps/storeutl.c
+++ b/crypto/openssl/apps/storeutl.c
@@ -331,14 +331,22 @@ int storeutl_main(int argc, char *argv[])
static int indent_printf(int indent, BIO *bio, const char *format, ...)
{
va_list args;
- int ret;
+ int ret, vret;
+
+ ret = BIO_printf(bio, "%*s", indent, "");
+ if (ret < 0)
+ return ret;
va_start(args, format);
+ vret = BIO_vprintf(bio, format, args);
+ va_end(args);
- ret = BIO_printf(bio, "%*s", indent, "") + BIO_vprintf(bio, format, args);
+ if (vret < 0)
+ return vret;
+ if (vret > INT_MAX - ret)
+ return INT_MAX;
- va_end(args);
- return ret;
+ return ret + vret;
}
static int process(const char *uri, const UI_METHOD *uimeth, PW_CB_DATA *uidata,
diff --git a/crypto/openssl/crypto/bio/bss_file.c b/crypto/openssl/crypto/bio/bss_file.c
index 2743a14417cf..ddcb4feb6a58 100644
--- a/crypto/openssl/crypto/bio/bss_file.c
+++ b/crypto/openssl/crypto/bio/bss_file.c
@@ -287,7 +287,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
if (fp == NULL) {
ERR_raise_data(ERR_LIB_SYS, get_last_sys_error(),
"calling fopen(%s, %s)",
- ptr, p);
+ (const char *)ptr, p);
ERR_raise(ERR_LIB_BIO, ERR_R_SYS_LIB);
ret = 0;
break;
diff --git a/crypto/openssl/crypto/ec/ecp_sm2p256.c b/crypto/openssl/crypto/ec/ecp_sm2p256.c
index ffb58399dfd0..4c39be2186fb 100644
--- a/crypto/openssl/crypto/ec/ecp_sm2p256.c
+++ b/crypto/openssl/crypto/ec/ecp_sm2p256.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2023 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2023-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
diff --git a/crypto/openssl/crypto/evp/bio_ok.c b/crypto/openssl/crypto/evp/bio_ok.c
index 20811ffded6f..d7f6c71ee1ad 100644
--- a/crypto/openssl/crypto/evp/bio_ok.c
+++ b/crypto/openssl/crypto/evp/bio_ok.c
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -560,7 +560,7 @@ static int block_in(BIO *b)
{
BIO_OK_CTX *ctx;
EVP_MD_CTX *md;
- unsigned long tl = 0;
+ size_t tl = 0;
unsigned char tmp[EVP_MAX_MD_SIZE];
int md_size;
@@ -571,15 +571,18 @@ static int block_in(BIO *b)
goto berr;
assert(sizeof(tl) >= OK_BLOCK_BLOCK); /* always true */
- tl = ctx->buf[0];
- tl <<= 8;
- tl |= ctx->buf[1];
- tl <<= 8;
- tl |= ctx->buf[2];
- tl <<= 8;
- tl |= ctx->buf[3];
-
- if (ctx->buf_len < tl + OK_BLOCK_BLOCK + md_size)
+ tl = ((size_t)ctx->buf[0] << 24)
+ | ((size_t)ctx->buf[1] << 16)
+ | ((size_t)ctx->buf[2] << 8)
+ | ((size_t)ctx->buf[3]);
+
+ if (tl > OK_BLOCK_SIZE)
+ goto berr;
+
+ if (tl > SIZE_MAX - OK_BLOCK_BLOCK - (size_t)md_size)
+ goto berr;
+
+ if (ctx->buf_len < tl + OK_BLOCK_BLOCK + (size_t)md_size)
return 1;
if (!EVP_DigestUpdate(md,
@@ -587,7 +590,7 @@ static int block_in(BIO *b)
goto berr;
if (!EVP_DigestFinal_ex(md, tmp, NULL))
goto berr;
- if (memcmp(&(ctx->buf[tl + OK_BLOCK_BLOCK]), tmp, md_size) == 0) {
+ if (memcmp(&(ctx->buf[tl + OK_BLOCK_BLOCK]), tmp, (size_t)md_size) == 0) {
/* there might be parts from next block lurking around ! */
ctx->buf_off_save = tl + OK_BLOCK_BLOCK + md_size;
ctx->buf_len_save = ctx->buf_len;
diff --git a/crypto/openssl/crypto/evp/ctrl_params_translate.c b/crypto/openssl/crypto/evp/ctrl_params_translate.c
index ed73fc0fbb8d..c846353200b2 100644
--- a/crypto/openssl/crypto/evp/ctrl_params_translate.c
+++ b/crypto/openssl/crypto/evp/ctrl_params_translate.c
@@ -1356,7 +1356,7 @@ static int fix_rsa_padding_mode(enum state state,
if (i == OSSL_NELEM(str_value_map)) {
ERR_raise_data(ERR_LIB_RSA, RSA_R_UNKNOWN_PADDING_TYPE,
"[action:%d, state:%d] padding name %s",
- ctx->action_type, state, ctx->p1);
+ ctx->action_type, state, (const char *)ctx->p2);
ctx->p1 = ret = -2;
} else if (state == POST_CTRL_TO_PARAMS) {
/* EVP_PKEY_CTRL_GET_RSA_PADDING weirdness explained further up */
diff --git a/crypto/openssl/crypto/evp/p_lib.c b/crypto/openssl/crypto/evp/p_lib.c
index 7f4508169dfa..63953a84e1f5 100644
--- a/crypto/openssl/crypto/evp/p_lib.c
+++ b/crypto/openssl/crypto/evp/p_lib.c
@@ -1146,15 +1146,14 @@ int EVP_PKEY_can_sign(const EVP_PKEY *pkey)
} else {
const OSSL_PROVIDER *prov = EVP_KEYMGMT_get0_provider(pkey->keymgmt);
OSSL_LIB_CTX *libctx = ossl_provider_libctx(prov);
- const char *supported_sig =
- pkey->keymgmt->query_operation_name != NULL
- ? pkey->keymgmt->query_operation_name(OSSL_OP_SIGNATURE)
- : EVP_KEYMGMT_get0_name(pkey->keymgmt);
- EVP_SIGNATURE *signature = NULL;
-
- signature = EVP_SIGNATURE_fetch(libctx, supported_sig, NULL);
- if (signature != NULL) {
- EVP_SIGNATURE_free(signature);
+ EVP_SIGNATURE *sig;
+ const char *name;
+
+ name = evp_keymgmt_util_query_operation_name(pkey->keymgmt,
+ OSSL_OP_SIGNATURE);
+ sig = EVP_SIGNATURE_fetch(libctx, name, NULL);
+ if (sig != NULL) {
+ EVP_SIGNATURE_free(sig);
return 1;
}
}
diff --git a/crypto/openssl/crypto/info.c b/crypto/openssl/crypto/info.c
index 4d70471be255..e760ec094027 100644
--- a/crypto/openssl/crypto/info.c
+++ b/crypto/openssl/crypto/info.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2019-2024 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -23,6 +23,9 @@
#if defined(__arm__) || defined(__arm) || defined(__aarch64__)
# include "arm_arch.h"
# define CPU_INFO_STR_LEN 128
+#elif defined(__powerpc__) || defined(__POWERPC__) || defined(_ARCH_PPC)
+# include "crypto/ppc_arch.h"
+# define CPU_INFO_STR_LEN 128
#elif defined(__s390__) || defined(__s390x__)
# include "s390x_arch.h"
# define CPU_INFO_STR_LEN 2048
@@ -77,6 +80,15 @@ DEFINE_RUN_ONCE_STATIC(init_info_strings)
BIO_snprintf(ossl_cpu_info_str + strlen(ossl_cpu_info_str),
sizeof(ossl_cpu_info_str) - strlen(ossl_cpu_info_str),
" env:%s", env);
+# elif defined(__powerpc__) || defined(__POWERPC__) || defined(_ARCH_PPC)
+ const char *env;
+
+ BIO_snprintf(ossl_cpu_info_str, sizeof(ossl_cpu_info_str),
+ CPUINFO_PREFIX "OPENSSL_ppccap=0x%x", OPENSSL_ppccap_P);
+ if ((env = getenv("OPENSSL_ppccap")) != NULL)
+ BIO_snprintf(ossl_cpu_info_str + strlen(ossl_cpu_info_str),
+ sizeof(ossl_cpu_info_str) - strlen(ossl_cpu_info_str),
+ " env:%s", env);
# elif defined(__s390__) || defined(__s390x__)
const char *env;
diff --git a/crypto/openssl/crypto/ml_dsa/ml_dsa_key.c b/crypto/openssl/crypto/ml_dsa/ml_dsa_key.c
index 41df1a956fb8..50e3b5433085 100644
--- a/crypto/openssl/crypto/ml_dsa/ml_dsa_key.c
+++ b/crypto/openssl/crypto/ml_dsa/ml_dsa_key.c
@@ -311,6 +311,7 @@ int ossl_ml_dsa_key_has(const ML_DSA_KEY *key, int selection)
static int public_from_private(const ML_DSA_KEY *key, EVP_MD_CTX *md_ctx,
VECTOR *t1, VECTOR *t0)
{
+ int ret = 0;
const ML_DSA_PARAMS *params = key->params;
uint32_t k = params->k, l = params->l;
POLY *polys;
@@ -343,9 +344,10 @@ static int public_from_private(const ML_DSA_KEY *key, EVP_MD_CTX *md_ctx,
/* Zeroize secret */
vector_zero(&s1_ntt);
+ ret = 1;
err:
OPENSSL_free(polys);
- return 1;
+ return ret;
}
int ossl_ml_dsa_key_public_from_private(ML_DSA_KEY *key)
diff --git a/crypto/openssl/crypto/ml_kem/ml_kem.c b/crypto/openssl/crypto/ml_kem/ml_kem.c
index 4474af0f87cb..716c3bf4275e 100644
--- a/crypto/openssl/crypto/ml_kem/ml_kem.c
+++ b/crypto/openssl/crypto/ml_kem/ml_kem.c
@@ -2046,5 +2046,5 @@ int ossl_ml_kem_pubkey_cmp(const ML_KEM_KEY *key1, const ML_KEM_KEY *key2)
* No match if just one of the public keys is not available, otherwise both
* are unavailable, and for now such keys are considered equal.
*/
- return (ossl_ml_kem_have_pubkey(key1) ^ ossl_ml_kem_have_pubkey(key2));
+ return (!(ossl_ml_kem_have_pubkey(key1) ^ ossl_ml_kem_have_pubkey(key2)));
}
diff --git a/crypto/openssl/crypto/modes/siv128.c b/crypto/openssl/crypto/modes/siv128.c
index 72526b849eaf..4e52d8eb8782 100644
--- a/crypto/openssl/crypto/modes/siv128.c
+++ b/crypto/openssl/crypto/modes/siv128.c
@@ -202,9 +202,12 @@ int ossl_siv128_init(SIV128_CONTEXT *ctx, const unsigned char *key, int klen,
|| !EVP_MAC_final(mac_ctx, ctx->d.byte, &out_len,
sizeof(ctx->d.byte))) {
EVP_CIPHER_CTX_free(ctx->cipher_ctx);
+ ctx->cipher_ctx = NULL;
EVP_MAC_CTX_free(ctx->mac_ctx_init);
+ ctx->mac_ctx_init = NULL;
EVP_MAC_CTX_free(mac_ctx);
EVP_MAC_free(ctx->mac);
+ ctx->mac = NULL;
return 0;
}
EVP_MAC_CTX_free(mac_ctx);
diff --git a/crypto/openssl/crypto/property/property_parse.c b/crypto/openssl/crypto/property/property_parse.c
index 3a67754224f0..23963c89bc46 100644
--- a/crypto/openssl/crypto/property/property_parse.c
+++ b/crypto/openssl/crypto/property/property_parse.c
@@ -641,7 +641,7 @@ static void put_str(const char *str, char **buf, size_t *remain, size_t *needed)
}
quotes = quote != '\0';
- if (*remain == 0) {
+ if (*remain <= (size_t)quotes) {
*needed += 2 * quotes;
return;
}
diff --git a/crypto/openssl/crypto/rsa/rsa_gen.c b/crypto/openssl/crypto/rsa/rsa_gen.c
index 033f66714add..f76bb7748369 100644
--- a/crypto/openssl/crypto/rsa/rsa_gen.c
+++ b/crypto/openssl/crypto/rsa/rsa_gen.c
@@ -734,18 +734,3 @@ err:
return ret;
}
-
-#ifdef FIPS_MODULE
-int ossl_rsa_key_pairwise_test(RSA *rsa)
-{
- OSSL_CALLBACK *stcb;
- void *stcbarg;
- int res;
-
- OSSL_SELF_TEST_get_callback(rsa->libctx, &stcb, &stcbarg);
- res = rsa_keygen_pairwise_test(rsa, stcb, stcbarg);
- if (res <= 0)
- ossl_set_error_state(OSSL_SELF_TEST_TYPE_PCT_IMPORT);
- return res;
-}
-#endif /* FIPS_MODULE */
diff --git a/crypto/openssl/crypto/rsa/rsa_sign.c b/crypto/openssl/crypto/rsa/rsa_sign.c
index 78e4bad69e49..bb6e99acf9d3 100644
--- a/crypto/openssl/crypto/rsa/rsa_sign.c
+++ b/crypto/openssl/crypto/rsa/rsa_sign.c
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -129,7 +129,7 @@ static const unsigned char digestinfo_ripemd160_der[] = {
# ifndef OPENSSL_NO_SM3
/* SM3 (1 2 156 10197 1 401) */
static const unsigned char digestinfo_sm3_der[] = {
- ASN1_SEQUENCE, 0x0f + SM3_DIGEST_LENGTH,
+ ASN1_SEQUENCE, 0x10 + SM3_DIGEST_LENGTH,
ASN1_SEQUENCE, 0x0c,
ASN1_OID, 0x08, 1 * 40 + 2, 0x81, 0x1c, 0xcf, 0x55, 1, 0x83, 0x78,
ASN1_NULL, 0x00,
diff --git a/crypto/openssl/crypto/threads_pthread.c b/crypto/openssl/crypto/threads_pthread.c
index 44d6ebe09231..ace2dc499061 100644
--- a/crypto/openssl/crypto/threads_pthread.c
+++ b/crypto/openssl/crypto/threads_pthread.c
@@ -62,8 +62,10 @@ __tsan_mutex_post_lock((x), 0, 0)
/*
* The Non-Stop KLT thread model currently seems broken in its rwlock
* implementation
+ * Likewise is there a problem with the glibc implementation on riscv.
*/
-# if defined(PTHREAD_RWLOCK_INITIALIZER) && !defined(_KLT_MODEL_)
+# if defined(PTHREAD_RWLOCK_INITIALIZER) && !defined(_KLT_MODEL_) \
+ && !defined(__riscv)
# define USE_RWLOCK
# endif
@@ -279,7 +281,7 @@ static struct rcu_qp *get_hold_current_qp(struct rcu_lock_st *lock)
/* if the idx hasn't changed, we're good, else try again */
if (qp_idx == ATOMIC_LOAD_N(uint32_t, &lock->reader_idx,
- __ATOMIC_RELAXED))
+ __ATOMIC_ACQUIRE))
break;
ATOMIC_SUB_FETCH(&lock->qp_group[qp_idx].users, (uint64_t)1,
@@ -403,8 +405,12 @@ static struct rcu_qp *update_qp(CRYPTO_RCU_LOCK *lock, uint32_t *curr_id)
*curr_id = lock->id_ctr;
lock->id_ctr++;
+ /*
+ * make the current state of everything visible by this release
+ * when get_hold_current_qp acquires the next qp
+ */
ATOMIC_STORE_N(uint32_t, &lock->reader_idx, lock->current_alloc_idx,
- __ATOMIC_RELAXED);
+ __ATOMIC_RELEASE);
/*
* this should make sure that the new value of reader_idx is visible in
diff --git a/crypto/openssl/crypto/x509/t_x509.c b/crypto/openssl/crypto/x509/t_x509.c
index 7d693669cd36..d849e642ce8b 100644
--- a/crypto/openssl/crypto/x509/t_x509.c
+++ b/crypto/openssl/crypto/x509/t_x509.c
@@ -219,7 +219,8 @@ int X509_ocspid_print(BIO *bp, X509 *x)
goto err;
if ((der = dertmp = OPENSSL_malloc(derlen)) == NULL)
goto err;
- i2d_X509_NAME(subj, &dertmp);
+ if (i2d_X509_NAME(subj, &dertmp) < 0)
+ goto err;
md = EVP_MD_fetch(x->libctx, SN_sha1, x->propq);
if (md == NULL)
diff --git a/crypto/openssl/crypto/x509/x509_lu.c b/crypto/openssl/crypto/x509/x509_lu.c
index 05ee7c8c6b51..eb2d47955b2e 100644
--- a/crypto/openssl/crypto/x509/x509_lu.c
+++ b/crypto/openssl/crypto/x509/x509_lu.c
@@ -408,7 +408,6 @@ static int x509_store_add(X509_STORE *store, void *x, int crl)
}
if (!X509_STORE_lock(store)) {
- obj->type = X509_LU_NONE;
X509_OBJECT_free(obj);
return 0;
}
diff --git a/crypto/openssl/doc/man3/DEFINE_STACK_OF.pod b/crypto/openssl/doc/man3/DEFINE_STACK_OF.pod
index ff2074820f68..eeb882f291e4 100644
--- a/crypto/openssl/doc/man3/DEFINE_STACK_OF.pod
+++ b/crypto/openssl/doc/man3/DEFINE_STACK_OF.pod
@@ -170,15 +170,14 @@ B<sk_I<TYPE>_set>() sets element I<idx> of I<sk> to I<ptr> replacing the current
element. The new element value is returned or NULL if an error occurred:
this will only happen if I<sk> is NULL or I<idx> is out of range.
-B<sk_I<TYPE>_find>() searches I<sk> for the element I<ptr>. In the case
-where no comparison function has been specified, the function performs
-a linear search for a pointer equal to I<ptr>. The index of the first
-matching element is returned or B<-1> if there is no match. In the case
-where a comparison function has been specified, I<sk> is sorted and
-B<sk_I<TYPE>_find>() returns the index of a matching element or B<-1> if there
-is no match. Note that, in this case the comparison function will usually
-compare the values pointed to rather than the pointers themselves and
-the order of elements in I<sk> can change.
+B<sk_I<TYPE>_find>() searches I<sk> for the element I<ptr>. In the
+case where no comparison function has been specified, the function
+performs a linear search for a pointer equal to I<ptr>. In the case
+where a comparison function has been specified, the function performs
+a search for a element that the comparison function indicates is a
+match. If the stack is sorted, a binary search is used, otherwise, a
+linear search is used. B<sk_I<TYPE>_find>() returns the index of a
+matching element or B<-1> if there is no match.
B<sk_I<TYPE>_find_ex>() operates like B<sk_I<TYPE>_find>() except when a
comparison function has been specified and no matching element is found.
@@ -301,7 +300,7 @@ was changed to return 0 in this condition as for other errors.
=head1 COPYRIGHT
-Copyright 2000-2024 The OpenSSL Project Authors. All Rights Reserved.
+Copyright 2000-2025 The OpenSSL Project Authors. All Rights Reserved.
Licensed under the Apache License 2.0 (the "License"). You may not use
this file except in compliance with the License. You can obtain a copy
diff --git a/crypto/openssl/doc/man3/OpenSSL_version.pod b/crypto/openssl/doc/man3/OpenSSL_version.pod
index e5dff33dcdda..6b899cbe5438 100644
--- a/crypto/openssl/doc/man3/OpenSSL_version.pod
+++ b/crypto/openssl/doc/man3/OpenSSL_version.pod
@@ -256,9 +256,16 @@ L<crypto(7)>
The macros and functions described here were added in OpenSSL 3.0,
except for OPENSSL_VERSION_NUMBER and OpenSSL_version_num().
+=head1 BUGS
+
+There was a discrepancy between this manual and commentary + code
+in F<< <openssl/opensslv.h> >>, where the latter suggested that the
+four least significant bits of B<OPENSSL_VERSION_NUMBER> could be
+C<0x0f> in released OpenSSL versions.
+
=head1 COPYRIGHT
-Copyright 2018-2022 The OpenSSL Project Authors. All Rights Reserved.
+Copyright 2018-2025 The OpenSSL Project Authors. All Rights Reserved.
Licensed under the Apache License 2.0 (the "License"). You may not use
this file except in compliance with the License. You can obtain a copy
diff --git a/crypto/openssl/doc/man3/SSL_CIPHER_get_name.pod b/crypto/openssl/doc/man3/SSL_CIPHER_get_name.pod
index 09b7280bdd58..a10942433aa7 100644
--- a/crypto/openssl/doc/man3/SSL_CIPHER_get_name.pod
+++ b/crypto/openssl/doc/man3/SSL_CIPHER_get_name.pod
@@ -37,7 +37,7 @@ SSL_CIPHER_get_protocol_id
int SSL_CIPHER_is_aead(const SSL_CIPHER *c);
const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr);
uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c);
- uint32_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *c);
+ uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *c);
=head1 DESCRIPTION
@@ -203,7 +203,7 @@ The OPENSSL_cipher_name() function was added in OpenSSL 1.1.1.
=head1 COPYRIGHT
-Copyright 2000-2024 The OpenSSL Project Authors. All Rights Reserved.
+Copyright 2000-2025 The OpenSSL Project Authors. All Rights Reserved.
Licensed under the Apache License 2.0 (the "License"). You may not use
this file except in compliance with the License. You can obtain a copy
diff --git a/crypto/openssl/doc/man3/SSL_SESSION_get0_hostname.pod b/crypto/openssl/doc/man3/SSL_SESSION_get0_hostname.pod
index f7add16d7bdd..0140deee9a5e 100644
--- a/crypto/openssl/doc/man3/SSL_SESSION_get0_hostname.pod
+++ b/crypto/openssl/doc/man3/SSL_SESSION_get0_hostname.pod
@@ -23,9 +23,10 @@ SSL_SESSION_set1_alpn_selected
=head1 DESCRIPTION
-SSL_SESSION_get0_hostname() retrieves the SNI value that was sent by the
-client when the session was created if it was accepted by the server. Otherwise
-NULL is returned.
+SSL_SESSION_get0_hostname() retrieves the Server Name Indication (SNI) value
+that was sent by the client when the session was created if the server
+acknowledged the client's SNI extension by including an empty SNI extension
+in response. Otherwise NULL is returned.
The value returned is a pointer to memory maintained within B<s> and
should not be free'd.
@@ -44,8 +45,7 @@ B<alpn>.
=head1 RETURN VALUES
-SSL_SESSION_get0_hostname() returns either a string or NULL based on if there
-is the SNI value sent by client.
+SSL_SESSION_get0_hostname() returns the SNI string if available, or NULL if not.
SSL_SESSION_set1_hostname() returns 1 on success or 0 on error.
diff --git a/crypto/openssl/include/crypto/rsa.h b/crypto/openssl/include/crypto/rsa.h
index ffbc95a77888..55cc814ce913 100644
--- a/crypto/openssl/include/crypto/rsa.h
+++ b/crypto/openssl/include/crypto/rsa.h
@@ -124,10 +124,6 @@ ASN1_STRING *ossl_rsa_ctx_to_pss_string(EVP_PKEY_CTX *pkctx);
int ossl_rsa_pss_to_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pkctx,
const X509_ALGOR *sigalg, EVP_PKEY *pkey);
-# ifdef FIPS_MODULE
-int ossl_rsa_key_pairwise_test(RSA *rsa);
-# endif /* FIPS_MODULE */
-
# if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS)
int ossl_rsa_acvp_test_gen_params_new(OSSL_PARAM **dst, const OSSL_PARAM src[]);
void ossl_rsa_acvp_test_gen_params_free(OSSL_PARAM *dst);
diff --git a/crypto/openssl/include/openssl/opensslv.h.in b/crypto/openssl/include/openssl/opensslv.h.in
index e547281ff527..69b9caacf4dc 100644
--- a/crypto/openssl/include/openssl/opensslv.h.in
+++ b/crypto/openssl/include/openssl/opensslv.h.in
@@ -89,12 +89,12 @@ extern "C" {
# define OPENSSL_VERSION_TEXT "OpenSSL {- "$config{full_version} $config{release_date}" -}"
-/* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
+/* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PP0L */
# define OPENSSL_VERSION_NUMBER \
( (OPENSSL_VERSION_MAJOR<<28) \
|(OPENSSL_VERSION_MINOR<<20) \
|(OPENSSL_VERSION_PATCH<<4) \
- |{- @config{prerelease} ? "0x0L" : "0xfL" -} )
+ |0x0L )
# ifdef __cplusplus
}
diff --git a/crypto/openssl/providers/fips-sources.checksums b/crypto/openssl/providers/fips-sources.checksums
index d48a9c85f57b..334b4ad6b7f2 100644
--- a/crypto/openssl/providers/fips-sources.checksums
+++ b/crypto/openssl/providers/fips-sources.checksums
@@ -250,7 +250,7 @@ c685813be6ad35b0861ba888670ef54aa2b399d003472698e39426de6e52db59 crypto/initthr
f866aafae928db1b439ac950dc90744a2397dfe222672fe68b3798396190c8b0 crypto/mem_clr.c
18127868d868ca5705444c24f7dc385391ba31154fc04ff54949739e8fa7fdfc crypto/ml_dsa/ml_dsa_encoders.c
825105b0a2c4844b2b4229001650ff7e61e1348e52f1072210f70b97cd4adb71 crypto/ml_dsa/ml_dsa_hash.h
-c82201cf1a17ff2d4b169dcd4402d3d56f4685e460a1447e021db4abd67f7f0e crypto/ml_dsa/ml_dsa_key.c
+c467f4400d399aad6b51746ef2575d1e04d260a1bf901b35ca55624fe62e650e crypto/ml_dsa/ml_dsa_key.c
579c1a12a5c5f014476a6bf695dc271f63074fb187e23ffc3f9ccb5b7ea044f1 crypto/ml_dsa/ml_dsa_key.h
3f98eb0467033d0a40867ef1c1036dcfea5d231eeac2321196f7d7c7243edace crypto/ml_dsa/ml_dsa_key_compress.c
983d164bfa3dbe8d85ad1fdc24d897e79d9246d96d9c1862855c6c538b387ad9 crypto/ml_dsa/ml_dsa_local.h
@@ -263,7 +263,7 @@ ff65c82c56e341f47df03d0c74de7fb537de0e68a4fa23fa07a9fdb51c511f1c crypto/ml_dsa/
1d7f57a41034988a4e7d4c9a998760d2ef802c5e90275d09a3ca31c5f3403d94 crypto/ml_dsa/ml_dsa_sign.c
5217ef237e21872205703b95577290c34898423466a465c7bd609b2eb4627964 crypto/ml_dsa/ml_dsa_sign.h
abd934284bcd8061027a69f437fa4410c6b72cd950be1ebe048244d036371208 crypto/ml_dsa/ml_dsa_vector.h
-defc2e4e81ff1b78056c795bc0565f4241a259c2957abe84a51bcbc1e4ace3f1 crypto/ml_kem/ml_kem.c
+8c4f7238f68f959f2ad1e2529c567364c5a8818898355c82818521e03239ea76 crypto/ml_kem/ml_kem.c
36e24eae5d38cc9666ae40e4e8a2dc12328e1159fea68447cb19dab174d25adf crypto/modes/asm/aes-gcm-armv8-unroll8_64.pl
33357356cd739d4ae89d52f0804b6900e4b94d8829323819c6f64c8908e978df crypto/modes/asm/aes-gcm-armv8_64.pl
bcc09bdb474f045d04c983fa09c31a010c5a25513f53a5d3653ade91304f0f96 crypto/modes/asm/aes-gcm-avx512.pl
@@ -306,7 +306,7 @@ f50450f7e5f6896fb8e3cde2fdc11cc543124c854ef9d88252a166606ca80081 crypto/params_
467c416422ecf61e3b713c5eb259fdbcb4aa73ae8dee61804d0b85cfd3fff4f7 crypto/property/defn_cache.c
91c1f1f8eb5588ed9da17386c244ae68a6a81717b1c7ab6c9f1a6a57973a039f crypto/property/property.c
66da4f28d408133fb544b14aeb9ad4913e7c5c67e2826e53f0dc5bf4d8fada26 crypto/property/property_local.h
-d32105cb087d708d0504a787f74bc163cc398c299faf2e98d6bb5ae02f5ce9b7 crypto/property/property_parse.c
+1e99a3934812f99dad79cbfbb6727ad61b6093711c1a6c74d4b50f9318152611 crypto/property/property_parse.c
a7cefda6a117550e2c76e0f307565ce1e11640b11ba10c80e469a837fd1212a3 crypto/property/property_query.c
20e69b9d594dfc443075eddbb0e6bcc0ed36ca51993cd50cc5a4f86eb31127f8 crypto/property/property_string.c
10644e9d20214660706de58d34edf635c110d4e4f2628cd5284a08c60ed9aff8 crypto/provider_core.c
@@ -322,7 +322,7 @@ f0c8792a99132e0b9c027cfa7370f45594a115934cdc9e8f23bdd64abecaf7fd crypto/rsa/rsa
1b828f428f0e78b591378f7b780164c4574620c68f9097de041cbd576f811bf6 crypto/rsa/rsa_backend.c
38a102cd1da1f6ca5a46e6a22f018237964336274385f5c70cbedcaa6997647e crypto/rsa/rsa_chk.c
e762c599b17d5c89f4b1c9eb7d0ca1f04a95d815c86a3e72c30b231ce57fb199 crypto/rsa/rsa_crpt.c
-0fa3e4687510e2d91c8f4b1c460b1d51375d9855ed825b3d6697620b146b52d1 crypto/rsa/rsa_gen.c
+a3d20f27ae3cb41af5b62febd0bb19025e59d401b136306d570cdba103b15542 crypto/rsa/rsa_gen.c
f22bc4e2c3acab83e67820c906c1caf048ec1f0d4fcb7472c1bec753c75f8e93 crypto/rsa/rsa_lib.c
5ae8edaf654645996385fbd420ef73030762fc146bf41deb5294d6d83e257a16 crypto/rsa/rsa_local.h
cf0b75cd54b61b9b9a290ef18d0ddce9fb26a029a54eb3f720d9b25188440f00 crypto/rsa/rsa_mp_names.c
@@ -416,7 +416,7 @@ a00e16963e1e2a0126c6a8e62da8a14f98de9736027654c925925dadd0ca3cc1 crypto/thread/
27ec0090f4243c96e4fbe1babfd4320c2a16615ffa368275433217d50a1ef76c crypto/thread/internal.c
67ba8d87fbbb7c9a9e438018e7ecfd1cedd4d00224be05755580d044f5f1317a crypto/threads_lib.c
b1a828491d9ce305802662561788facac92dff70cca9ead807f3e28741ff21e0 crypto/threads_none.c
-c659f7ce5c4b59d2a1cff78485fa8e89c8d20d5798df4afc1b94ff635ffc0262 crypto/threads_pthread.c
+491e9c29d4a7b4dd627ea25c20ce4a33103565b3108b618c41c6816dfc675569 crypto/threads_pthread.c
9c3bf7b4baa302a4017150fbcaa114ee9df935b18d5a3a8c8015003780d4e7de crypto/threads_win.c
7edd638df588b14711a50c98d458c4fc83f223ed03bc6c39c7c8edf7915b7cfa crypto/time.c
88c5f9f4d2611223d283ebd2ae10ae5ecbb9972d00f747d93fcb74b62641e3f9 crypto/x86_64cpuid.pl
@@ -445,7 +445,7 @@ bbe5e52d84e65449a13e42cd2d6adce59b8ed6e73d6950917aa77dc1f3f5dff6 include/crypto
6e7762e7fb63f56d25b24f70209f4dc834c59a87f74467531ec81646f565dbe3 include/crypto/modes.h
920bc48a4dad3712bdcef188c0ce8e8a8304e0ce332b54843bab366fc5eab472 include/crypto/rand.h
71f23915ea74e93971fb0205901031be3abea7ffef2c52e4cc4848515079f68d include/crypto/rand_pool.h
-b1df067691f9741ef9c42b2e5f12461bcd87b745514fc5701b9c9402fb10b224 include/crypto/rsa.h
+6f16685ffbc97dc2ac1240bfddf4bbac2dd1ad83fff6da91aee6f3f64c6ee8ff include/crypto/rsa.h
32f0149ab1d82fddbdfbbc44e3078b4a4cc6936d35187e0f8d02cc0bc19f2401 include/crypto/security_bits.h
80338f3865b7c74aab343879432a6399507b834e2f55dd0e9ee7a5eeba11242a include/crypto/sha.h
dc7808729c3231a08bbe470b3e1b562420030f59f7bc05b14d7b516fa77b4f3a include/crypto/slh_dsa.h
@@ -546,7 +546,7 @@ a8a45996fd21411cb7ed610bc202dbd06570cdfa0a2d14f7dfc8bfadc820e636 include/openss
cb6bca3913c60a57bac39583eee0f789d49c3d29be3ecde9aecc7f3287117aa5 include/openssl/objects.h
d25537af264684dff033dd8ae62b0348f868fcfec4aa51fa8f07bcfa4bd807ad include/openssl/objectserr.h
fe6acd42c3e90db31aaafc2236a7d30ebfa53c4c07ea4d8265064c7fcb951970 include/openssl/opensslconf.h
-fc914a750d798ac9fc9287e6359cfa1da214b91651deaaaa7e1a46b595cd0425 include/openssl/opensslv.h.in
+6c1a8837bbba633db2a8951ff29ccfe09e7d2a24a37ee2af90f2d897c190da9a include/openssl/opensslv.h.in
767d9d7d5051c937a3ce8a268c702902fda93eeaa210a94dfde1f45c23277d20 include/openssl/param_build.h
1c442aaaa4dda7fbf727a451bc676fb4d855ef617c14dc77ff2a5e958ae33c3e include/openssl/params.h
44f178176293c6ce8142890ff9dc2d466364c734e4e811f56bd62010c5403183 include/openssl/pkcs7.h.in
@@ -618,8 +618,8 @@ f2581d7b4e105f2bb6d30908f3c2d9959313be08cec6dbeb49030c125a7676d3 providers/fips
669f76f742bcaaf28846b057bfab97da7c162d69da244de71b7c743bf16e430f providers/fips/include/fipscommon.h
f111fd7e016af8cc6f96cd8059c28227b328dd466ed137ae0c0bc0c3c3eec3ba providers/fips/self_test.c
5c2c6c2f69e2eb01b88fa35630f27948e00dd2c2fd351735c74f34ccb2005cbe providers/fips/self_test.h
-663441de9aba1d1b81ce02b3acded520b88cc460330d4d98adb7450d9664c474 providers/fips/self_test_data.inc
-2e568e2b161131240e97bd77a730c2299f961c2f1409ea8466422fc07f9be23f providers/fips/self_test_kats.c
+df83c901ad13675fbbb4708b6087feba6099870ad3dd0e8d09cfdb6798419770 providers/fips/self_test_data.inc
+6779d5afb3f48d82868b247ffb0a6a572f6e3964738296ad47e7ccafdb263c88 providers/fips/self_test_kats.c
dde79dfdedfe0e73006a0cf912fdde1ff109dfbc5ba6ecab319c938bc4275950 providers/implementations/asymciphers/rsa_enc.c
c2f1b12c64fc369dfc3b9bc9e76a76de7280e6429adaee55d332eb1971ad1879 providers/implementations/ciphers/cipher_aes.c
6ba7d817081cf0d87ba7bfb38cd9d70e41505480bb8bc796ef896f68d4514ea6 providers/implementations/ciphers/cipher_aes.h
@@ -699,7 +699,7 @@ c764555b9dc9b273c280514a5d2d44156f82f3e99155a77c627f2c773209bcd7 providers/impl
24cc3cc8e8681c77b7f96c83293bd66045fd8ad69f756e673ca7f8ca9e82b0af providers/implementations/keymgmt/dsa_kmgmt.c
36a9c1c8658ce7918453827cb58ed52787e590e3f148c5510deeb2c16c25a29d providers/implementations/keymgmt/ec_kmgmt.c
258ae17bb2dd87ed1511a8eb3fe99eed9b77f5c2f757215ff6b3d0e8791fc251 providers/implementations/keymgmt/ec_kmgmt_imexport.inc
-9728d696d249b2d224724c9872138a60e1998e5cfa5c49f3f48ad0666f7eed34 providers/implementations/keymgmt/ecx_kmgmt.c
+11c27cc3c9f38885c484f25d11987e93f197aa90bef2fc1d6e8f508c2d014d4d providers/implementations/keymgmt/ecx_kmgmt.c
daf35a7ab961ef70aefca981d80407935904c5da39dca6692432d6e6bc98759d providers/implementations/keymgmt/kdf_legacy_kmgmt.c
d97d7c8d3410b3e560ef2becaea2a47948e22205be5162f964c5e51a7eef08cb providers/implementations/keymgmt/mac_legacy_kmgmt.c
a428de71082fd01e5dcfa030a6fc34f6700b86d037b4e22f015c917862a158ce providers/implementations/keymgmt/ml_dsa_kmgmt.c
diff --git a/crypto/openssl/providers/fips.checksum b/crypto/openssl/providers/fips.checksum
index 7fa4ea19bba3..5d1117361d27 100644
--- a/crypto/openssl/providers/fips.checksum
+++ b/crypto/openssl/providers/fips.checksum
@@ -1 +1 @@
-8d0c2c2b986f4c98f511c9aa020e98aa984dce5976d8e1966a7721f8b559cda8 providers/fips-sources.checksums
+c342f9dc7075a6ecd0e4b3c9db06e180765278a7bbae233ec1a65095a0e524ec providers/fips-sources.checksums
diff --git a/crypto/openssl/providers/fips/self_test_data.inc b/crypto/openssl/providers/fips/self_test_data.inc
index b6aa433ca93c..6abab0a7a173 100644
--- a/crypto/openssl/providers/fips/self_test_data.inc
+++ b/crypto/openssl/providers/fips/self_test_data.inc
@@ -1308,6 +1308,18 @@ static const ST_KAT_PARAM rsa_priv_key[] = {
ST_KAT_PARAM_END()
};
+/*-
+ * Using OSSL_PKEY_RSA_PAD_MODE_NONE directly in the expansion of the
+ * ST_KAT_PARAM_UTF8STRING macro below causes a failure on ancient
+ * HP/UX PA-RISC compilers.
+ */
+static const char pad_mode_none[] = OSSL_PKEY_RSA_PAD_MODE_NONE;
+
+static const ST_KAT_PARAM rsa_enc_params[] = {
+ ST_KAT_PARAM_UTF8STRING(OSSL_ASYM_CIPHER_PARAM_PAD_MODE, pad_mode_none),
+ ST_KAT_PARAM_END()
+};
+
static const unsigned char rsa_sig_msg[] = "Hello World!";
static const unsigned char rsa_expected_sig[256] = {
@@ -3497,3 +3509,33 @@ static const ST_KAT_ASYM_KEYGEN st_kat_asym_keygen_tests[] = {
# endif
};
#endif /* !OPENSSL_NO_ML_DSA || !OPENSSL_NO_SLH_DSA */
+
+static const ST_KAT_ASYM_CIPHER st_kat_asym_cipher_tests[] = {
+ {
+ OSSL_SELF_TEST_DESC_ASYM_RSA_ENC,
+ "RSA",
+ 1,
+ rsa_pub_key,
+ rsa_enc_params,
+ ITM(rsa_asym_plaintext_encrypt),
+ ITM(rsa_asym_expected_encrypt),
+ },
+ {
+ OSSL_SELF_TEST_DESC_ASYM_RSA_DEC,
+ "RSA",
+ 0,
+ rsa_priv_key,
+ rsa_enc_params,
+ ITM(rsa_asym_expected_encrypt),
+ ITM(rsa_asym_plaintext_encrypt),
+ },
+ {
+ OSSL_SELF_TEST_DESC_ASYM_RSA_DEC,
+ "RSA",
+ 0,
+ rsa_crt_key,
+ rsa_enc_params,
+ ITM(rsa_asym_expected_encrypt),
+ ITM(rsa_asym_plaintext_encrypt),
+ },
+};
diff --git a/crypto/openssl/providers/fips/self_test_kats.c b/crypto/openssl/providers/fips/self_test_kats.c
index 35ecb43598ee..acb0b85f7343 100644
--- a/crypto/openssl/providers/fips/self_test_kats.c
+++ b/crypto/openssl/providers/fips/self_test_kats.c
@@ -813,6 +813,93 @@ err:
#endif
/*
+ * Test an encrypt or decrypt KAT..
+ *
+ * FIPS 140-2 IG D.9 states that separate KAT tests are needed for encrypt
+ * and decrypt..
+ */
+static int self_test_asym_cipher(const ST_KAT_ASYM_CIPHER *t, OSSL_SELF_TEST *st,
+ OSSL_LIB_CTX *libctx)
+{
+ int ret = 0;
+ OSSL_PARAM *keyparams = NULL, *initparams = NULL;
+ OSSL_PARAM_BLD *keybld = NULL, *initbld = NULL;
+ EVP_PKEY_CTX *encctx = NULL, *keyctx = NULL;
+ EVP_PKEY *key = NULL;
+ BN_CTX *bnctx = NULL;
+ unsigned char out[256];
+ size_t outlen = sizeof(out);
+
+ OSSL_SELF_TEST_onbegin(st, OSSL_SELF_TEST_TYPE_KAT_ASYM_CIPHER, t->desc);
+
+ bnctx = BN_CTX_new_ex(libctx);
+ if (bnctx == NULL)
+ goto err;
+
+ /* Load a public or private key from data */
+ keybld = OSSL_PARAM_BLD_new();
+ if (keybld == NULL
+ || !add_params(keybld, t->key, bnctx))
+ goto err;
+ keyparams = OSSL_PARAM_BLD_to_param(keybld);
+ keyctx = EVP_PKEY_CTX_new_from_name(libctx, t->algorithm, NULL);
+ if (keyctx == NULL || keyparams == NULL)
+ goto err;
+ if (EVP_PKEY_fromdata_init(keyctx) <= 0
+ || EVP_PKEY_fromdata(keyctx, &key, EVP_PKEY_KEYPAIR, keyparams) <= 0)
+ goto err;
+
+ /* Create a EVP_PKEY_CTX to use for the encrypt or decrypt operation */
+ encctx = EVP_PKEY_CTX_new_from_pkey(libctx, key, NULL);
+ if (encctx == NULL
+ || (t->encrypt && EVP_PKEY_encrypt_init(encctx) <= 0)
+ || (!t->encrypt && EVP_PKEY_decrypt_init(encctx) <= 0))
+ goto err;
+
+ /* Add any additional parameters such as padding */
+ if (t->postinit != NULL) {
+ initbld = OSSL_PARAM_BLD_new();
+ if (initbld == NULL)
+ goto err;
+ if (!add_params(initbld, t->postinit, bnctx))
+ goto err;
+ initparams = OSSL_PARAM_BLD_to_param(initbld);
+ if (initparams == NULL)
+ goto err;
+ if (EVP_PKEY_CTX_set_params(encctx, initparams) <= 0)
+ goto err;
+ }
+
+ if (t->encrypt) {
+ if (EVP_PKEY_encrypt(encctx, out, &outlen,
+ t->in, t->in_len) <= 0)
+ goto err;
+ } else {
+ if (EVP_PKEY_decrypt(encctx, out, &outlen,
+ t->in, t->in_len) <= 0)
+ goto err;
+ }
+ /* Check the KAT */
+ OSSL_SELF_TEST_oncorrupt_byte(st, out);
+ if (outlen != t->expected_len
+ || memcmp(out, t->expected, t->expected_len) != 0)
+ goto err;
+
+ ret = 1;
+err:
+ BN_CTX_free(bnctx);
+ EVP_PKEY_free(key);
+ EVP_PKEY_CTX_free(encctx);
+ EVP_PKEY_CTX_free(keyctx);
+ OSSL_PARAM_free(keyparams);
+ OSSL_PARAM_BLD_free(keybld);
+ OSSL_PARAM_free(initparams);
+ OSSL_PARAM_BLD_free(initbld);
+ OSSL_SELF_TEST_onend(st, ret);
+ return ret;
+}
+
+/*
* Test a data driven list of KAT's for digest algorithms.
* All tests are run regardless of if they fail or not.
* Return 0 if any test fails.
@@ -853,6 +940,17 @@ static int self_test_kems(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx)
return ret;
}
+static int self_test_asym_ciphers(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx)
+{
+ int i, ret = 1;
+
+ for (i = 0; i < (int)OSSL_NELEM(st_kat_asym_cipher_tests); ++i) {
+ if (!self_test_asym_cipher(&st_kat_asym_cipher_tests[i], st, libctx))
+ ret = 0;
+ }
+ return ret;
+}
+
static int self_test_kdfs(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx)
{
int i, ret = 1;
@@ -1092,6 +1190,8 @@ int SELF_TEST_kats(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx)
ret = 0;
if (!self_test_kems(st, libctx))
ret = 0;
+ if (!self_test_asym_ciphers(st, libctx))
+ ret = 0;
RAND_set0_private(libctx, saved_rand);
return ret;
diff --git a/crypto/openssl/providers/implementations/kdfs/krb5kdf.c b/crypto/openssl/providers/implementations/kdfs/krb5kdf.c
index 566afa74fece..13623ec7302e 100644
--- a/crypto/openssl/providers/implementations/kdfs/krb5kdf.c
+++ b/crypto/openssl/providers/implementations/kdfs/krb5kdf.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2018-2024 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2018-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -350,7 +350,7 @@ static int cipher_init(EVP_CIPHER_CTX *ctx,
{
int klen, ret;
- ret = EVP_EncryptInit_ex(ctx, cipher, engine, key, NULL);
+ ret = EVP_EncryptInit_ex(ctx, cipher, engine, NULL, NULL);
if (!ret)
goto out;
/* set the key len for the odd variable key len cipher */
@@ -362,6 +362,9 @@ static int cipher_init(EVP_CIPHER_CTX *ctx,
goto out;
}
}
+ ret = EVP_EncryptInit_ex(ctx, NULL, NULL, key, NULL);
+ if (!ret)
+ goto out;
/* we never want padding, either the length requested is a multiple of
* the cipher block size or we are passed a cipher that can cope with
* partial blocks via techniques like cipher text stealing */
diff --git a/crypto/openssl/providers/implementations/keymgmt/ecx_kmgmt.c b/crypto/openssl/providers/implementations/keymgmt/ecx_kmgmt.c
index e6d326a90705..0ebe8b4d59b1 100644
--- a/crypto/openssl/providers/implementations/keymgmt/ecx_kmgmt.c
+++ b/crypto/openssl/providers/implementations/keymgmt/ecx_kmgmt.c
@@ -218,14 +218,6 @@ static int ecx_import(void *keydata, int selection, const OSSL_PARAM params[])
include_private = selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY ? 1 : 0;
ok = ok && ossl_ecx_key_fromdata(key, params, include_private);
-#ifdef FIPS_MODULE
- if (ok > 0 && ecx_key_type_is_ed(key->type) && !ossl_fips_self_testing())
- if (key->haspubkey && key->privkey != NULL) {
- ok = ecd_fips140_pairwise_test(key, key->type, 1);
- if (ok <= 0)
- ossl_set_error_state(OSSL_SELF_TEST_TYPE_PCT_IMPORT);
- }
-#endif /* FIPS_MODULE */
return ok;
}
diff --git a/crypto/openssl/ssl/quic/quic_impl.c b/crypto/openssl/ssl/quic/quic_impl.c
index c44e6b33c2a8..cec05d5bd37b 100644
--- a/crypto/openssl/ssl/quic/quic_impl.c
+++ b/crypto/openssl/ssl/quic/quic_impl.c
@@ -3197,6 +3197,7 @@ int ossl_quic_conn_stream_conclude(SSL *s)
QCTX ctx;
QUIC_STREAM *qs;
int err;
+ int ret;
if (!expect_quic_with_stream_lock(s, /*remote_init=*/0, /*io=*/0, &ctx))
return 0;
@@ -3204,13 +3205,15 @@ int ossl_quic_conn_stream_conclude(SSL *s)
qs = ctx.xso->stream;
if (!quic_mutation_allowed(ctx.qc, /*req_active=*/1)) {
+ ret = QUIC_RAISE_NON_NORMAL_ERROR(&ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
qctx_unlock(&ctx);
- return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
+ return ret;
}
if (!quic_validate_for_write(ctx.xso, &err)) {
+ ret = QUIC_RAISE_NON_NORMAL_ERROR(&ctx, err, NULL);
qctx_unlock(&ctx);
- return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, err, NULL);
+ return ret;
}
if (ossl_quic_sstream_get_final_size(qs->sstream, NULL)) {
diff --git a/crypto/openssl/ssl/record/methods/tls_common.c b/crypto/openssl/ssl/record/methods/tls_common.c
index 80d4477bd0c0..b9c79099462d 100644
--- a/crypto/openssl/ssl/record/methods/tls_common.c
+++ b/crypto/openssl/ssl/record/methods/tls_common.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2022-2024 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2022-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -1093,9 +1093,12 @@ int tls13_common_post_process_record(OSSL_RECORD_LAYER *rl, TLS_RL_RECORD *rec)
return 0;
}
- if (rl->msg_callback != NULL)
- rl->msg_callback(0, rl->version, SSL3_RT_INNER_CONTENT_TYPE, &rec->type,
- 1, rl->cbarg);
+ if (rl->msg_callback != NULL) {
+ unsigned char ctype = (unsigned char)rec->type;
+
+ rl->msg_callback(0, rl->version, SSL3_RT_INNER_CONTENT_TYPE, &ctype,
+ 1, rl->cbarg);
+ }
/*
* TLSv1.3 alert and handshake records are required to be non-zero in
diff --git a/crypto/openssl/ssl/ssl_rsa.c b/crypto/openssl/ssl/ssl_rsa.c
index e833bcdbc377..f4731a87af90 100644
--- a/crypto/openssl/ssl/ssl_rsa.c
+++ b/crypto/openssl/ssl/ssl_rsa.c
@@ -1056,10 +1056,13 @@ static int ssl_set_cert_and_key(SSL *ssl, SSL_CTX *ctx, X509 *x509, EVP_PKEY *pr
}
}
- if (!X509_up_ref(x509))
+ if (!X509_up_ref(x509)) {
+ OSSL_STACK_OF_X509_free(dup_chain);
goto out;
+ }
if (!EVP_PKEY_up_ref(privatekey)) {
+ OSSL_STACK_OF_X509_free(dup_chain);
X509_free(x509);
goto out;
}
diff --git a/crypto/openssl/ssl/t1_trce.c b/crypto/openssl/ssl/t1_trce.c
index 35c60feb4371..73fd4ebaa4b0 100644
--- a/crypto/openssl/ssl/t1_trce.c
+++ b/crypto/openssl/ssl/t1_trce.c
@@ -549,8 +549,12 @@ static const ssl_trace_tbl ssl_groups_tbl[] = {
{258, "ffdhe4096"},
{259, "ffdhe6144"},
{260, "ffdhe8192"},
+ {512, "MLKEM512"},
+ {513, "MLKEM768"},
+ {514, "MLKEM1024"},
{4587, "SecP256r1MLKEM768"},
{4588, "X25519MLKEM768"},
+ {4589, "SecP384r1MLKEM1024"},
{25497, "X25519Kyber768Draft00"},
{25498, "SecP256r1Kyber768Draft00"},
{0xFF01, "arbitrary_explicit_prime_curves"},
diff --git a/crypto/openssl/test/build.info b/crypto/openssl/test/build.info
index 9d9be6b642e9..3dca6117796b 100644
--- a/crypto/openssl/test/build.info
+++ b/crypto/openssl/test/build.info
@@ -31,7 +31,8 @@ IF[{- !$disabled{tests} -}]
testutil/format_output.c testutil/load.c testutil/fake_random.c \
testutil/test_cleanup.c testutil/main.c testutil/testutil_init.c \
testutil/options.c testutil/test_options.c testutil/provider.c \
- testutil/apps_shims.c testutil/random.c testutil/helper.c $LIBAPPSSRC
+ testutil/apps_shims.c testutil/random.c testutil/helper.c \
+ testutil/compare.c $LIBAPPSSRC
INCLUDE[libtestutil.a]=../include ../apps/include ..
DEPEND[libtestutil.a]=../libcrypto
diff --git a/crypto/openssl/test/fake_rsaprov.c b/crypto/openssl/test/fake_rsaprov.c
index 46fc9104ef95..6ed121554336 100644
--- a/crypto/openssl/test/fake_rsaprov.c
+++ b/crypto/openssl/test/fake_rsaprov.c
@@ -35,6 +35,8 @@ static int exptypes_selection;
static int query_id;
static int key_deleted;
+unsigned fake_rsa_query_operation_name = 0;
+
typedef struct {
OSSL_LIB_CTX *libctx;
} PROV_FAKE_RSA_CTX;
@@ -90,7 +92,7 @@ static const char *fake_rsa_keymgmt_query(int id)
/* record global for checking */
query_id = id;
- return "RSA";
+ return fake_rsa_query_operation_name ? NULL: "RSA";
}
static int fake_rsa_keymgmt_import(void *keydata, int selection,
diff --git a/crypto/openssl/test/fake_rsaprov.h b/crypto/openssl/test/fake_rsaprov.h
index cb2e66eb68ef..00e7dccb4872 100644
--- a/crypto/openssl/test/fake_rsaprov.h
+++ b/crypto/openssl/test/fake_rsaprov.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2021-2023 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2021-2025 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -14,5 +14,14 @@
/* Fake RSA provider implementation */
OSSL_PROVIDER *fake_rsa_start(OSSL_LIB_CTX *libctx);
void fake_rsa_finish(OSSL_PROVIDER *p);
+
OSSL_PARAM *fake_rsa_key_params(int priv);
void fake_rsa_restore_store_state(void);
+
+/*
+ * When fake_rsa_query_operation_name is set to a non-zero value,
+ * query_operation_name() will return NULL.
+ *
+ * By default, it is 0, in which case query_operation_name() will return "RSA".
+ */
+extern unsigned fake_rsa_query_operation_name;
diff --git a/crypto/openssl/test/ml_kem_evp_extra_test.c b/crypto/openssl/test/ml_kem_evp_extra_test.c
index bfa52c9af2e6..b867b14ad1d4 100644
--- a/crypto/openssl/test/ml_kem_evp_extra_test.c
+++ b/crypto/openssl/test/ml_kem_evp_extra_test.c
@@ -140,9 +140,19 @@ static int test_ml_kem(void)
if (!TEST_int_gt(EVP_PKEY_copy_parameters(bkey, akey), 0))
goto err;
+ /* Bob's empty key is not equal to Alice's */
+ if (!TEST_false(EVP_PKEY_eq(akey, bkey))
+ || !TEST_false(EVP_PKEY_eq(bkey, akey)))
+ goto err;
+
if (!TEST_true(EVP_PKEY_set1_encoded_public_key(bkey, rawpub, publen)))
goto err;
+ /* Bob's copy of Alice's public key makes the two equal */
+ if (!TEST_true(EVP_PKEY_eq(akey, bkey))
+ || !TEST_true(EVP_PKEY_eq(bkey, akey)))
+ goto err;
+
/* Encapsulate Bob's key */
ctx = EVP_PKEY_CTX_new_from_pkey(testctx, bkey, NULL);
if (!TEST_ptr(ctx))
diff --git a/crypto/openssl/test/property_test.c b/crypto/openssl/test/property_test.c
index 18f8cc8740e0..e62ff247c42c 100644
--- a/crypto/openssl/test/property_test.c
+++ b/crypto/openssl/test/property_test.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved.
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
@@ -687,6 +687,22 @@ static int test_property_list_to_string(int i)
return ret;
}
+static int test_property_list_to_string_bounds(void)
+{
+ OSSL_PROPERTY_LIST *pl = NULL;
+ char buf[16];
+ int ret = 0;
+
+ if (!TEST_ptr(pl = ossl_parse_query(NULL, "provider='$1'", 1)))
+ goto err;
+ if (!TEST_size_t_eq(ossl_property_list_to_string(NULL, pl, buf, 10), 14))
+ goto err;
+ ret = 1;
+ err:
+ ossl_property_free(pl);
+ return ret;
+}
+
int setup_tests(void)
{
ADD_TEST(test_property_string);
@@ -701,5 +717,6 @@ int setup_tests(void)
ADD_TEST(test_query_cache_stochastic);
ADD_TEST(test_fips_mode);
ADD_ALL_TESTS(test_property_list_to_string, OSSL_NELEM(to_string_tests));
+ ADD_TEST(test_property_list_to_string_bounds);
return 1;
}
diff --git a/crypto/openssl/test/provider_pkey_test.c b/crypto/openssl/test/provider_pkey_test.c
index cb656a62a650..9ffe3581d62a 100644
--- a/crypto/openssl/test/provider_pkey_test.c
+++ b/crypto/openssl/test/provider_pkey_test.c
@@ -239,6 +239,77 @@ end:
return ret;
}
+static int test_pkey_can_sign(void)
+{
+ OSSL_PROVIDER *fake_rsa = NULL;
+ EVP_PKEY *pkey_fake = NULL;
+ EVP_PKEY_CTX *ctx = NULL;
+ OSSL_PARAM *params = NULL;
+ int ret = 0;
+
+ if (!TEST_ptr(fake_rsa = fake_rsa_start(libctx)))
+ return 0;
+
+ /*
+ * Ensure other tests did not forget to reset fake_rsa_query_operation_name
+ * to its default value: 0
+ */
+ if (!TEST_int_eq(fake_rsa_query_operation_name, 0))
+ goto end;
+
+ if (!TEST_ptr(params = fake_rsa_key_params(0))
+ || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA",
+ "provider=fake-rsa"))
+ || !TEST_true(EVP_PKEY_fromdata_init(ctx))
+ || !TEST_true(EVP_PKEY_fromdata(ctx, &pkey_fake, EVP_PKEY_PUBLIC_KEY,
+ params))
+ || !TEST_true(EVP_PKEY_can_sign(pkey_fake))
+ || !TEST_ptr(pkey_fake))
+ goto end;
+
+ EVP_PKEY_CTX_free(ctx);
+ ctx = NULL;
+ EVP_PKEY_free(pkey_fake);
+ pkey_fake = NULL;
+ OSSL_PARAM_free(params);
+ params = NULL;
+
+ /*
+ * Documented behavior for OSSL_FUNC_keymgmt_query_operation_name()
+ * allows it to return NULL, in which case the fallback should be to use
+ * EVP_KEYMGMT_get0_name(). That is exactly the thing we are testing here.
+ */
+ fake_rsa_query_operation_name = 1;
+
+ if (!TEST_ptr(params = fake_rsa_key_params(0))
+ || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA",
+ "provider=fake-rsa"))
+ || !TEST_true(EVP_PKEY_fromdata_init(ctx))
+ || !TEST_true(EVP_PKEY_fromdata(ctx, &pkey_fake, EVP_PKEY_PUBLIC_KEY,
+ params))
+ || !TEST_true(EVP_PKEY_can_sign(pkey_fake))
+ || !TEST_ptr(pkey_fake))
+ goto end;
+
+ EVP_PKEY_CTX_free(ctx);
+ ctx = NULL;
+ EVP_PKEY_free(pkey_fake);
+ pkey_fake = NULL;
+ OSSL_PARAM_free(params);
+ params = NULL;
+
+ ret = 1;
+end:
+
+ EVP_PKEY_CTX_free(ctx);
+ EVP_PKEY_free(pkey_fake);
+ OSSL_PARAM_free(params);
+ fake_rsa_query_operation_name = 0;
+
+ fake_rsa_finish(fake_rsa);
+ return ret;
+}
+
static int test_pkey_store(int idx)
{
OSSL_PROVIDER *deflt = NULL;
@@ -719,6 +790,7 @@ int setup_tests(void)
ADD_TEST(test_pkey_sig);
ADD_TEST(test_alternative_keygen_init);
ADD_TEST(test_pkey_eq);
+ ADD_TEST(test_pkey_can_sign);
ADD_ALL_TESTS(test_pkey_store, 2);
ADD_TEST(test_pkey_delete);
ADD_TEST(test_pkey_store_open_ex);
diff --git a/crypto/openssl/test/quicapitest.c b/crypto/openssl/test/quicapitest.c
index f665c511bb72..4e887c13d14c 100644
--- a/crypto/openssl/test/quicapitest.c
+++ b/crypto/openssl/test/quicapitest.c
@@ -428,91 +428,6 @@ static int test_version(void)
}
#if defined(DO_SSL_TRACE_TEST)
-static void strip_line_ends(char *str)
-{
- size_t i;
-
- for (i = strlen(str);
- i > 0 && (str[i - 1] == '\n' || str[i - 1] == '\r');
- i--);
-
- str[i] = '\0';
-}
-
-static int compare_with_file(BIO *membio)
-{
- BIO *file = NULL, *newfile = NULL;
- char buf1[8192], buf2[8192];
- char *reffile;
- int ret = 0;
- size_t i;
-
-#ifdef OPENSSL_NO_ZLIB
- reffile = test_mk_file_path(datadir, "ssltraceref.txt");
-#else
- reffile = test_mk_file_path(datadir, "ssltraceref-zlib.txt");
-#endif
- if (!TEST_ptr(reffile))
- goto err;
-
- file = BIO_new_file(reffile, "rb");
- if (!TEST_ptr(file))
- goto err;
-
- newfile = BIO_new_file("ssltraceref-new.txt", "wb");
- if (!TEST_ptr(newfile))
- goto err;
-
- while (BIO_gets(membio, buf2, sizeof(buf2)) > 0)
- if (BIO_puts(newfile, buf2) <= 0) {
- TEST_error("Failed writing new file data");
- goto err;
- }
-
- if (!TEST_int_ge(BIO_seek(membio, 0), 0))
- goto err;
-
- while (BIO_gets(file, buf1, sizeof(buf1)) > 0) {
- size_t line_len;
-
- if (BIO_gets(membio, buf2, sizeof(buf2)) <= 0) {
- TEST_error("Failed reading mem data");
- goto err;
- }
- strip_line_ends(buf1);
- strip_line_ends(buf2);
- line_len = strlen(buf1);
- if (line_len > 0 && buf1[line_len - 1] == '?') {
- /* Wildcard at the EOL means ignore anything after it */
- if (strlen(buf2) > line_len)
- buf2[line_len] = '\0';
- }
- if (line_len != strlen(buf2)) {
- TEST_error("Actual and ref line data length mismatch");
- TEST_info("%s", buf1);
- TEST_info("%s", buf2);
- goto err;
- }
- for (i = 0; i < line_len; i++) {
- /* '?' is a wild card character in the reference text */
- if (buf1[i] == '?')
- buf2[i] = '?';
- }
- if (!TEST_str_eq(buf1, buf2))
- goto err;
- }
- if (!TEST_true(BIO_eof(file))
- || !TEST_true(BIO_eof(membio)))
- goto err;
-
- ret = 1;
- err:
- OPENSSL_free(reffile);
- BIO_free(file);
- BIO_free(newfile);
- return ret;
-}
-
/*
* Tests that the SSL_trace() msg_callback works as expected with a QUIC
* connection. This also provides testing of the msg_callback at the same time.
@@ -524,6 +439,7 @@ static int test_ssl_trace(void)
QUIC_TSERVER *qtserv = NULL;
int testresult = 0;
BIO *bio = NULL;
+ char *reffile = NULL;
if (!TEST_ptr(cctx = SSL_CTX_new_ex(libctx, NULL, OSSL_QUIC_client_method()))
|| !TEST_ptr(bio = BIO_new(BIO_s_mem()))
@@ -547,7 +463,13 @@ static int test_ssl_trace(void)
if (!TEST_int_gt(BIO_pending(bio), 0))
goto err;
} else {
- if (!TEST_true(compare_with_file(bio)))
+
+# ifdef OPENSSL_NO_ZLIB
+ reffile = test_mk_file_path(datadir, "ssltraceref.txt");
+# else
+ reffile = test_mk_file_path(datadir, "ssltraceref-zlib.txt");
+# endif
+ if (!TEST_true(compare_with_reference_file(bio, reffile)))
goto err;
}
@@ -557,6 +479,7 @@ static int test_ssl_trace(void)
SSL_free(clientquic);
SSL_CTX_free(cctx);
BIO_free(bio);
+ OPENSSL_free(reffile);
return testresult;
}
diff --git a/crypto/openssl/test/radix/terp.c b/crypto/openssl/test/radix/terp.c
index 3c83fd9b18b0..41d3bdeb9fd4 100644
--- a/crypto/openssl/test/radix/terp.c
+++ b/crypto/openssl/test/radix/terp.c
@@ -871,8 +871,10 @@ err:
}
GEN_SCRIPT_cleanup(&gen_script);
- BIO_printf(debug_bio, "Stats:\n Ops executed: %16llu\n\n",
- (unsigned long long)terp.ops_executed);
+ if (have_terp) {
+ BIO_printf(debug_bio, "Stats:\n Ops executed: %16llu\n\n",
+ (unsigned long long)terp.ops_executed);
+ }
SCRIPT_INFO_print(script_info, debug_bio, /*error=*/!ok,
ok ? "completed" : "failed, exiting");
return ok;
diff --git a/crypto/openssl/test/recipes/03-test_fipsinstall.t b/crypto/openssl/test/recipes/03-test_fipsinstall.t
index 1f9110ef600a..3dcbe67c6d55 100644
--- a/crypto/openssl/test/recipes/03-test_fipsinstall.t
+++ b/crypto/openssl/test/recipes/03-test_fipsinstall.t
@@ -63,7 +63,7 @@ my @commandline =
( 'x942kdf_key_check', 'x942kdf-key-check' )
);
-plan tests => 40 + (scalar @pedantic_okay) + (scalar @pedantic_fail)
+plan tests => 41 + (scalar @pedantic_okay) + (scalar @pedantic_fail)
+ 4 * (scalar @commandline);
my $infile = bldtop_file('providers', platform->dso('fips'));
@@ -392,6 +392,16 @@ SKIP: {
"fipsinstall fails when the ML-KEM decapsulate implicit failure result is corrupted");
}
+# corrupt an Asymmetric cipher test
+SKIP: {
+ skip "Skipping Asymmetric RSA corruption test because of no rsa in this build", 1
+ if disabled("rsa") || disabled("fips-post");
+ ok(!run(app(['openssl', 'fipsinstall', '-out', 'fips.cnf', '-module', $infile,
+ '-corrupt_desc', 'RSA_Encrypt',
+ '-corrupt_type', 'KAT_AsymmetricCipher'])),
+ "fipsinstall fails when the asymmetric cipher result is corrupted");
+}
+
# 'local' ensures that this change is only done in this file.
local $ENV{OPENSSL_CONF_INCLUDE} = abs2rel(curdir());
diff --git a/crypto/openssl/test/recipes/25-test_verify.t b/crypto/openssl/test/recipes/25-test_verify.t
index 271f499690bf..673c3d5f1772 100644
--- a/crypto/openssl/test/recipes/25-test_verify.t
+++ b/crypto/openssl/test/recipes/25-test_verify.t
@@ -602,9 +602,10 @@ ok(vfy_root("-CAfile", $rootcert), "CAfile");
ok(vfy_root("-CAstore", $rootcert), "CAstore");
ok(vfy_root("-CAstore", $rootcert, "-CAfile", $rootcert), "CAfile and existing CAstore");
ok(!vfy_root("-CAstore", "non-existing", "-CAfile", $rootcert), "CAfile and non-existing CAstore");
+
SKIP: {
- skip "file names with colons aren't supported on Windows and VMS", 2
- if $^O =~ /^(MsWin32|VMS)$/;
+ skip "file names with colons aren't supported on Windows and VMS", 1
+ if $^O =~ /^(MSWin32|VMS)$/;
my $foo_file = "foo:cert.pem";
copy($rootcert, $foo_file);
ok(vfy_root("-CAstore", $foo_file), "CAstore foo:file");
diff --git a/crypto/openssl/test/recipes/30-test_evp_data/evpkdf_krb5.txt b/crypto/openssl/test/recipes/30-test_evp_data/evpkdf_krb5.txt
index d8f6aa72a175..e2de4754fa74 100644
--- a/crypto/openssl/test/recipes/30-test_evp_data/evpkdf_krb5.txt
+++ b/crypto/openssl/test/recipes/30-test_evp_data/evpkdf_krb5.txt
@@ -1,5 +1,5 @@
#
-# Copyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved.
+# Copyright 2001-2025 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
@@ -129,3 +129,11 @@ Ctrl.cipher = cipher:DES-EDE3-CBC
Ctrl.hexkey = hexkey:dce06b1f64c857a11c3db57c51899b2cc1791008ce973b92
Ctrl.hexconstant = hexconstant:0000000155
Output = 935079d14490a75c3093c4a6e8c3b049c71e6ee705
+
+#Erroneous key size for the cipher as XTS has double key size
+KDF = KRB5KDF
+Ctrl.cipher = cipher:AES-256-XTS
+Ctrl.hexkey = hexkey:FE697B52BC0D3CE14432BA036A92E65BBB52280990A2FA27883998D72AF30161
+Ctrl.hexconstant = hexconstant:0000000255
+Output = 97151B4C76945063E2EB0529DC067D97D7BBA90776D8126D91F34F3101AEA8BA
+Result = KDF_DERIVE_ERROR
diff --git a/crypto/openssl/test/recipes/30-test_evp_data/evppkey_rsa_sigalg.txt b/crypto/openssl/test/recipes/30-test_evp_data/evppkey_rsa_sigalg.txt
index 5083cc2bde24..f258700670ab 100644
--- a/crypto/openssl/test/recipes/30-test_evp_data/evppkey_rsa_sigalg.txt
+++ b/crypto/openssl/test/recipes/30-test_evp_data/evppkey_rsa_sigalg.txt
@@ -1,5 +1,5 @@
#
-# Copyright 2001-2024 The OpenSSL Project Authors. All Rights Reserved.
+# Copyright 2001-2025 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
@@ -186,4 +186,4 @@ Output = 6a7fc08e9999fc9d50cda476e973a01a06efeb52eece1c78cb1422950476cbff67408c6
Availablein = default
Sign-Message = RSA-SM3:RSA-2048
Input = "Hello World"
-Output = 92657e22036214c343d8e95d129c0c47430d5a1ae452371a7847a963f533f96e018aa6658958e6a584cf0d380aa9435175cf2de3dfa60100aca893b76aa6d8f0cc9154ee982cb5ea8f19153fe8a9c801aa2da8bb4451c7ec6fd836e81ecdacf022b68294db068efa47decf3a7c548ea7088a16433029b8733b9573053b7e7122ea10b662726fc97bd149c663617434a9707b672b024f95865d91077edfb79c8ed4c8528032204c46c984a6c82b17794cbf9c4dfe4c1af1d59535f7755540ff36d6a2b55accbf046896c4aae9287a33f38c2a269a02abdac46c17b1b55ee89cc9eb3011a84916596f982c5375dd2110633be6dc43532919466d83bd0f3e406978
+Output = b74e03c18050807541bde949aa0ac91d43fb9730f0b529d5100d5776f4f446d0ca0f0992359dc5f89386ed45bc3bf52cac1f75fbcc088fc2ea77624fd962569d2d317e90886dec424fb6757c4eba1e881ddf4f7942e8003b54e05cc974558dea171ce23a2fc158f71a5621c9a2c3ce45c9af4c706d3f60efe0c0f087a6ec504f771b08e2a1d78e0316c74706c678869bf121d5da00e2e8c8dc1cd273315b4ad8ab9962c62f81cebc5fb393b7f8860ee68545578413feada82b1c2bbfabfa157e298f0354bffc1cc6aa68f058a5d34b6b70ffacd3532c6b2c6a0de059bf605edf392ac8adbf1769555a0a50b2b13c63cae98a461498fae7f0d1729b710f05f39e
diff --git a/crypto/openssl/test/recipes/90-test_sslapi.t b/crypto/openssl/test/recipes/90-test_sslapi.t
index 650e0d1ffb16..70c2c24d8661 100644
--- a/crypto/openssl/test/recipes/90-test_sslapi.t
+++ b/crypto/openssl/test/recipes/90-test_sslapi.t
@@ -1,5 +1,5 @@
#! /usr/bin/env perl
-# Copyright 2016-2024 The OpenSSL Project Authors. All Rights Reserved.
+# Copyright 2016-2025 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
@@ -45,7 +45,10 @@ ok(run(test(["sslapitest", srctop_dir("test", "certs"),
srctop_file("test",
"recipes",
"90-test_sslapi_data",
- "dhparams.pem")])),
+ "dhparams.pem"),
+ srctop_dir("test",
+ "recipes",
+ "90-test_sslapi_data")])),
"running sslapitest");
SKIP: {
@@ -62,7 +65,10 @@ SKIP: {
srctop_file("test",
"recipes",
"90-test_sslapi_data",
- "dhparams.pem")])),
+ "dhparams.pem"),
+ srctop_dir("test",
+ "recipes",
+ "90-test_sslapi_data")])),
"running sslapitest with default fips config");
run(test(["fips_version_test", "-config", $provconf, ">=3.1.0"]),
@@ -140,7 +146,10 @@ SKIP: {
srctop_file("test",
"recipes",
"90-test_sslapi_data",
- "dhparams.pem")])),
+ "dhparams.pem"),
+ srctop_dir("test",
+ "recipes",
+ "90-test_sslapi_data")])),
"running sslapitest with modified fips config");
}
diff --git a/crypto/openssl/test/recipes/90-test_sslapi_data/ssltraceref-zlib.txt b/crypto/openssl/test/recipes/90-test_sslapi_data/ssltraceref-zlib.txt
new file mode 100644
index 000000000000..05aed8299b0e
--- /dev/null
+++ b/crypto/openssl/test/recipes/90-test_sslapi_data/ssltraceref-zlib.txt
@@ -0,0 +1,255 @@
+Sent TLS Record
+Header:
+ Version = TLS 1.0 (0x301)
+ Content Type = Handshake (22)
+ Length = ?
+ ClientHello, Length=?
+ client_version=0x303 (TLS 1.2)
+ Random:
+ gmt_unix_time=0x?
+ random_bytes (len=28): ?
+ session_id (len=?
+ cipher_suites (len=2)
+ {0x13, 0x01} TLS_AES_128_GCM_SHA256
+ compression_methods (len=1)
+ No Compression (0x00)
+ extensions, length = ?
+ extension_type=ec_point_formats(11), length=4
+ uncompressed (0)
+ ansiX962_compressed_prime (1)
+ ansiX962_compressed_char2 (2)
+ extension_type=supported_groups(10), length=20
+ MLKEM512 (512)
+ MLKEM768 (513)
+ MLKEM1024 (514)
+ X25519MLKEM768 (4588)
+ SecP256r1MLKEM768 (4587)
+ SecP384r1MLKEM1024 (4589)
+ secp521r1 (P-521) (25)
+ secp384r1 (P-384) (24)
+ secp256r1 (P-256) (23)
+ extension_type=session_ticket(35), length=0
+ extension_type=encrypt_then_mac(22), length=0
+ extension_type=extended_master_secret(23), length=0
+ extension_type=signature_algorithms(13), length=?
+ mldsa65 (0x0905)
+ mldsa87 (0x0906)
+ mldsa44 (0x0904)
+ ecdsa_secp256r1_sha256 (0x0403)
+ ecdsa_secp384r1_sha384 (0x0503)
+ ecdsa_secp521r1_sha512 (0x0603)
+ ed25519 (0x0807)
+ ed448 (0x0808)
+ ecdsa_brainpoolP256r1tls13_sha256 (0x081a)
+ ecdsa_brainpoolP384r1tls13_sha384 (0x081b)
+ ecdsa_brainpoolP512r1tls13_sha512 (0x081c)
+ rsa_pss_pss_sha256 (0x0809)
+ rsa_pss_pss_sha384 (0x080a)
+ rsa_pss_pss_sha512 (0x080b)
+ rsa_pss_rsae_sha256 (0x0804)
+ rsa_pss_rsae_sha384 (0x0805)
+ rsa_pss_rsae_sha512 (0x0806)
+ rsa_pkcs1_sha256 (0x0401)
+ rsa_pkcs1_sha384 (0x0501)
+ rsa_pkcs1_sha512 (0x0601)
+ extension_type=supported_versions(43), length=3
+ TLS 1.3 (772)
+ extension_type=psk_key_exchange_modes(45), length=2
+ psk_dhe_ke (1)
+ extension_type=key_share(51), length=806
+ NamedGroup: MLKEM512 (512)
+ key_exchange: (len=800): ?
+ extension_type=compress_certificate(27), length=3
+ zlib (1)
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = Handshake (22)
+ Length = 858
+ ServerHello, Length=854
+ server_version=0x303 (TLS 1.2)
+ Random:
+ gmt_unix_time=0x?
+ random_bytes (len=28): ?
+ session_id (len=?
+ cipher_suite {0x13, 0x01} TLS_AES_128_GCM_SHA256
+ compression_method: No Compression (0x00)
+ extensions, length = ?
+ extension_type=supported_versions(43), length=2
+ TLS 1.3 (772)
+ extension_type=key_share(51), length=772
+ NamedGroup: MLKEM512 (512)
+ key_exchange: (len=768): ?
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ChangeCipherSpec (20)
+ Length = 1
+ change_cipher_spec (1)
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 23
+ Inner Content Type = Handshake (22)
+ EncryptedExtensions, Length=2
+ No extensions
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 839
+ Inner Content Type = Handshake (22)
+ Certificate, Length=818
+ context (len=0):
+ certificate_list, length=814
+ ASN.1Cert, length=809
+------details-----
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 2 (0x2)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: CN = Root CA
+ Validity
+ Not Before: Jan 14 22:29:46 2016 GMT
+ Not After : Jan 15 22:29:46 2116 GMT
+ Subject: CN = server.example
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:d5:5d:60:6a:df:fc:61:ee:48:aa:8c:11:48:43:
+ a5:6d:b6:52:5d:aa:98:49:b1:61:92:35:b1:fc:3a:
+ 04:25:0c:6d:79:ff:b4:d5:c9:e9:5c:1c:3b:e0:ab:
+ b3:b8:7d:a3:de:6d:bd:e0:dd:d7:5a:bf:14:47:11:
+ 42:5e:a6:82:d0:61:c1:7f:dd:13:46:e6:09:85:07:
+ 0e:f2:d4:fc:1a:64:d2:0a:ad:20:ab:20:6b:96:f0:
+ ad:cc:c4:19:53:55:dc:01:1d:a4:b3:ef:8a:b4:49:
+ 53:5d:8a:05:1c:f1:dc:e1:44:bf:c5:d7:e2:77:19:
+ 57:5c:97:0b:75:ee:88:43:71:0f:ca:6c:c1:b4:b2:
+ 50:a7:77:46:6c:58:0f:11:bf:f1:76:24:5a:ae:39:
+ 42:b7:51:67:29:e1:d0:55:30:6f:17:e4:91:ea:ad:
+ f8:28:c2:43:6f:a2:64:a9:fb:9d:98:92:62:48:3e:
+ eb:0d:4f:82:4a:8a:ff:3f:72:ee:96:b5:ae:a1:c1:
+ 98:ba:ef:7d:90:75:6d:ff:5a:52:9e:ab:f5:c0:7e:
+ d0:87:43:db:85:07:07:0f:7d:38:7a:fd:d1:d3:ee:
+ 65:1d:d3:ea:39:6a:87:37:ee:4a:d3:e0:0d:6e:f5:
+ 70:ac:c2:bd:f1:6e:f3:92:95:5e:a9:f0:a1:65:95:
+ 93:8d
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ C0:E7:84:BF:E8:59:27:33:10:B0:52:4F:51:52:2F:06:D6:C0:7A:CD
+ X509v3 Authority Key Identifier:
+ 70:7F:2E:AE:83:68:59:98:04:23:2A:CD:EB:3E:17:CD:24:DD:01:49
+ X509v3 Basic Constraints:
+ CA:FALSE
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication
+ X509v3 Subject Alternative Name:
+ DNS:server.example
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ 7b:d3:04:43:75:8a:0f:11:ae:c4:fb:d7:a1:a2:9e:fe:20:18:
+ d5:f4:2f:31:88:46:b6:75:8c:ee:e5:9b:97:a6:b9:a3:cd:60:
+ 9a:46:c3:48:97:e5:97:68:f7:5a:86:35:73:d9:69:9e:f9:5f:
+ 74:b9:e6:94:13:01:cb:6a:dc:e3:c4:04:e9:65:da:9c:a4:8b:
+ 28:f3:f9:9a:7f:bf:97:1f:45:92:e5:05:b1:56:e6:0b:f6:47:
+ de:1e:89:b6:2b:e1:4d:df:4a:7e:01:d3:23:dc:97:8c:47:fe:
+ 5f:c7:cc:98:46:0e:c4:83:5b:ca:8a:f1:52:09:be:6b:ec:3f:
+ 09:8b:d0:93:02:bf:e1:51:e7:d1:7e:34:56:19:74:d0:ff:28:
+ 25:de:b7:9f:56:52:91:7d:20:29:85:0a:80:44:5f:71:32:25:
+ 71:0f:c2:16:e2:5f:6b:1d:3f:32:5b:0a:3c:74:1c:b9:62:f1:
+ ed:07:50:a3:6d:b4:b4:31:0a:c0:53:44:6a:3a:88:84:8b:2d:
+ a9:b0:37:8e:e6:18:36:bd:9a:20:40:0f:01:92:8b:3d:aa:61:
+ e7:ae:2c:ed:36:cd:3a:07:86:74:3a:29:b3:d7:3a:b4:00:a9:
+ c2:f5:92:78:0e:e2:0f:a3:fe:bb:be:e0:06:53:84:59:1d:90:
+ 69:e5:b6:f9
+-----BEGIN CERTIFICATE-----
+MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdSb290
+IENBMCAXDTE2MDExNDIyMjk0NloYDzIxMTYwMTE1MjIyOTQ2WjAZMRcwFQYDVQQD
+DA5zZXJ2ZXIuZXhhbXBsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANVdYGrf/GHuSKqMEUhDpW22Ul2qmEmxYZI1sfw6BCUMbXn/tNXJ6VwcO+Crs7h9
+o95tveDd11q/FEcRQl6mgtBhwX/dE0bmCYUHDvLU/Bpk0gqtIKsga5bwrczEGVNV
+3AEdpLPvirRJU12KBRzx3OFEv8XX4ncZV1yXC3XuiENxD8pswbSyUKd3RmxYDxG/
+8XYkWq45QrdRZynh0FUwbxfkkeqt+CjCQ2+iZKn7nZiSYkg+6w1PgkqK/z9y7pa1
+rqHBmLrvfZB1bf9aUp6r9cB+0IdD24UHBw99OHr90dPuZR3T6jlqhzfuStPgDW71
+cKzCvfFu85KVXqnwoWWVk40CAwEAAaN9MHswHQYDVR0OBBYEFMDnhL/oWSczELBS
+T1FSLwbWwHrNMB8GA1UdIwQYMBaAFHB/Lq6DaFmYBCMqzes+F80k3QFJMAkGA1Ud
+EwQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwGQYDVR0RBBIwEIIOc2VydmVyLmV4
+YW1wbGUwDQYJKoZIhvcNAQELBQADggEBAHvTBEN1ig8RrsT716Ginv4gGNX0LzGI
+RrZ1jO7lm5emuaPNYJpGw0iX5Zdo91qGNXPZaZ75X3S55pQTActq3OPEBOll2pyk
+iyjz+Zp/v5cfRZLlBbFW5gv2R94eibYr4U3fSn4B0yPcl4xH/l/HzJhGDsSDW8qK
+8VIJvmvsPwmL0JMCv+FR59F+NFYZdND/KCXet59WUpF9ICmFCoBEX3EyJXEPwhbi
+X2sdPzJbCjx0HLli8e0HUKNttLQxCsBTRGo6iISLLamwN47mGDa9miBADwGSiz2q
+YeeuLO02zToHhnQ6KbPXOrQAqcL1kngO4g+j/ru+4AZThFkdkGnltvk=
+-----END CERTIFICATE-----
+------------------
+ No extensions
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 281
+ Inner Content Type = Handshake (22)
+ CertificateVerify, Length=260
+ Signature Algorithm: rsa_pss_rsae_sha256 (0x0804)
+ Signature (len=256): ?
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 53
+ Inner Content Type = Handshake (22)
+ Finished, Length=32
+ verify_data (len=32): ?
+
+Sent TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ChangeCipherSpec (20)
+ Length = 1
+ change_cipher_spec (1)
+
+Sent TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 53
+ Inner Content Type = Handshake (22)
+ Finished, Length=32
+ verify_data (len=32): ?
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 234
+ Inner Content Type = Handshake (22)
+ NewSessionTicket, Length=213
+ ticket_lifetime_hint=7200
+ ticket_age_add=?
+ ticket_nonce (len=8): ?
+ ticket (len=192): ?
+ No extensions
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 234
+ Inner Content Type = Handshake (22)
+ NewSessionTicket, Length=213
+ ticket_lifetime_hint=7200
+ ticket_age_add=?
+ ticket_nonce (len=8): ?
+ ticket (len=192): ?
+ No extensions
+
diff --git a/crypto/openssl/test/recipes/90-test_sslapi_data/ssltraceref.txt b/crypto/openssl/test/recipes/90-test_sslapi_data/ssltraceref.txt
new file mode 100644
index 000000000000..5d332da235fb
--- /dev/null
+++ b/crypto/openssl/test/recipes/90-test_sslapi_data/ssltraceref.txt
@@ -0,0 +1,253 @@
+Sent TLS Record
+Header:
+ Version = TLS 1.0 (0x301)
+ Content Type = Handshake (22)
+ Length = ?
+ ClientHello, Length=?
+ client_version=0x303 (TLS 1.2)
+ Random:
+ gmt_unix_time=0x?
+ random_bytes (len=28): ?
+ session_id (len=?
+ cipher_suites (len=2)
+ {0x13, 0x01} TLS_AES_128_GCM_SHA256
+ compression_methods (len=1)
+ No Compression (0x00)
+ extensions, length = ?
+ extension_type=ec_point_formats(11), length=4
+ uncompressed (0)
+ ansiX962_compressed_prime (1)
+ ansiX962_compressed_char2 (2)
+ extension_type=supported_groups(10), length=20
+ MLKEM512 (512)
+ MLKEM768 (513)
+ MLKEM1024 (514)
+ X25519MLKEM768 (4588)
+ SecP256r1MLKEM768 (4587)
+ SecP384r1MLKEM1024 (4589)
+ secp521r1 (P-521) (25)
+ secp384r1 (P-384) (24)
+ secp256r1 (P-256) (23)
+ extension_type=session_ticket(35), length=0
+ extension_type=encrypt_then_mac(22), length=0
+ extension_type=extended_master_secret(23), length=0
+ extension_type=signature_algorithms(13), length=?
+ mldsa65 (0x0905)
+ mldsa87 (0x0906)
+ mldsa44 (0x0904)
+ ecdsa_secp256r1_sha256 (0x0403)
+ ecdsa_secp384r1_sha384 (0x0503)
+ ecdsa_secp521r1_sha512 (0x0603)
+ ed25519 (0x0807)
+ ed448 (0x0808)
+ ecdsa_brainpoolP256r1tls13_sha256 (0x081a)
+ ecdsa_brainpoolP384r1tls13_sha384 (0x081b)
+ ecdsa_brainpoolP512r1tls13_sha512 (0x081c)
+ rsa_pss_pss_sha256 (0x0809)
+ rsa_pss_pss_sha384 (0x080a)
+ rsa_pss_pss_sha512 (0x080b)
+ rsa_pss_rsae_sha256 (0x0804)
+ rsa_pss_rsae_sha384 (0x0805)
+ rsa_pss_rsae_sha512 (0x0806)
+ rsa_pkcs1_sha256 (0x0401)
+ rsa_pkcs1_sha384 (0x0501)
+ rsa_pkcs1_sha512 (0x0601)
+ extension_type=supported_versions(43), length=3
+ TLS 1.3 (772)
+ extension_type=psk_key_exchange_modes(45), length=2
+ psk_dhe_ke (1)
+ extension_type=key_share(51), length=806
+ NamedGroup: MLKEM512 (512)
+ key_exchange: (len=800): ?
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = Handshake (22)
+ Length = 858
+ ServerHello, Length=854
+ server_version=0x303 (TLS 1.2)
+ Random:
+ gmt_unix_time=0x?
+ random_bytes (len=28): ?
+ session_id (len=?
+ cipher_suite {0x13, 0x01} TLS_AES_128_GCM_SHA256
+ compression_method: No Compression (0x00)
+ extensions, length = ?
+ extension_type=supported_versions(43), length=2
+ TLS 1.3 (772)
+ extension_type=key_share(51), length=772
+ NamedGroup: MLKEM512 (512)
+ key_exchange: (len=768): ?
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ChangeCipherSpec (20)
+ Length = 1
+ change_cipher_spec (1)
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 23
+ Inner Content Type = Handshake (22)
+ EncryptedExtensions, Length=2
+ No extensions
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 839
+ Inner Content Type = Handshake (22)
+ Certificate, Length=818
+ context (len=0):
+ certificate_list, length=814
+ ASN.1Cert, length=809
+------details-----
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 2 (0x2)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: CN = Root CA
+ Validity
+ Not Before: Jan 14 22:29:46 2016 GMT
+ Not After : Jan 15 22:29:46 2116 GMT
+ Subject: CN = server.example
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:d5:5d:60:6a:df:fc:61:ee:48:aa:8c:11:48:43:
+ a5:6d:b6:52:5d:aa:98:49:b1:61:92:35:b1:fc:3a:
+ 04:25:0c:6d:79:ff:b4:d5:c9:e9:5c:1c:3b:e0:ab:
+ b3:b8:7d:a3:de:6d:bd:e0:dd:d7:5a:bf:14:47:11:
+ 42:5e:a6:82:d0:61:c1:7f:dd:13:46:e6:09:85:07:
+ 0e:f2:d4:fc:1a:64:d2:0a:ad:20:ab:20:6b:96:f0:
+ ad:cc:c4:19:53:55:dc:01:1d:a4:b3:ef:8a:b4:49:
+ 53:5d:8a:05:1c:f1:dc:e1:44:bf:c5:d7:e2:77:19:
+ 57:5c:97:0b:75:ee:88:43:71:0f:ca:6c:c1:b4:b2:
+ 50:a7:77:46:6c:58:0f:11:bf:f1:76:24:5a:ae:39:
+ 42:b7:51:67:29:e1:d0:55:30:6f:17:e4:91:ea:ad:
+ f8:28:c2:43:6f:a2:64:a9:fb:9d:98:92:62:48:3e:
+ eb:0d:4f:82:4a:8a:ff:3f:72:ee:96:b5:ae:a1:c1:
+ 98:ba:ef:7d:90:75:6d:ff:5a:52:9e:ab:f5:c0:7e:
+ d0:87:43:db:85:07:07:0f:7d:38:7a:fd:d1:d3:ee:
+ 65:1d:d3:ea:39:6a:87:37:ee:4a:d3:e0:0d:6e:f5:
+ 70:ac:c2:bd:f1:6e:f3:92:95:5e:a9:f0:a1:65:95:
+ 93:8d
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ C0:E7:84:BF:E8:59:27:33:10:B0:52:4F:51:52:2F:06:D6:C0:7A:CD
+ X509v3 Authority Key Identifier:
+ 70:7F:2E:AE:83:68:59:98:04:23:2A:CD:EB:3E:17:CD:24:DD:01:49
+ X509v3 Basic Constraints:
+ CA:FALSE
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication
+ X509v3 Subject Alternative Name:
+ DNS:server.example
+ Signature Algorithm: sha256WithRSAEncryption
+ Signature Value:
+ 7b:d3:04:43:75:8a:0f:11:ae:c4:fb:d7:a1:a2:9e:fe:20:18:
+ d5:f4:2f:31:88:46:b6:75:8c:ee:e5:9b:97:a6:b9:a3:cd:60:
+ 9a:46:c3:48:97:e5:97:68:f7:5a:86:35:73:d9:69:9e:f9:5f:
+ 74:b9:e6:94:13:01:cb:6a:dc:e3:c4:04:e9:65:da:9c:a4:8b:
+ 28:f3:f9:9a:7f:bf:97:1f:45:92:e5:05:b1:56:e6:0b:f6:47:
+ de:1e:89:b6:2b:e1:4d:df:4a:7e:01:d3:23:dc:97:8c:47:fe:
+ 5f:c7:cc:98:46:0e:c4:83:5b:ca:8a:f1:52:09:be:6b:ec:3f:
+ 09:8b:d0:93:02:bf:e1:51:e7:d1:7e:34:56:19:74:d0:ff:28:
+ 25:de:b7:9f:56:52:91:7d:20:29:85:0a:80:44:5f:71:32:25:
+ 71:0f:c2:16:e2:5f:6b:1d:3f:32:5b:0a:3c:74:1c:b9:62:f1:
+ ed:07:50:a3:6d:b4:b4:31:0a:c0:53:44:6a:3a:88:84:8b:2d:
+ a9:b0:37:8e:e6:18:36:bd:9a:20:40:0f:01:92:8b:3d:aa:61:
+ e7:ae:2c:ed:36:cd:3a:07:86:74:3a:29:b3:d7:3a:b4:00:a9:
+ c2:f5:92:78:0e:e2:0f:a3:fe:bb:be:e0:06:53:84:59:1d:90:
+ 69:e5:b6:f9
+-----BEGIN CERTIFICATE-----
+MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdSb290
+IENBMCAXDTE2MDExNDIyMjk0NloYDzIxMTYwMTE1MjIyOTQ2WjAZMRcwFQYDVQQD
+DA5zZXJ2ZXIuZXhhbXBsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANVdYGrf/GHuSKqMEUhDpW22Ul2qmEmxYZI1sfw6BCUMbXn/tNXJ6VwcO+Crs7h9
+o95tveDd11q/FEcRQl6mgtBhwX/dE0bmCYUHDvLU/Bpk0gqtIKsga5bwrczEGVNV
+3AEdpLPvirRJU12KBRzx3OFEv8XX4ncZV1yXC3XuiENxD8pswbSyUKd3RmxYDxG/
+8XYkWq45QrdRZynh0FUwbxfkkeqt+CjCQ2+iZKn7nZiSYkg+6w1PgkqK/z9y7pa1
+rqHBmLrvfZB1bf9aUp6r9cB+0IdD24UHBw99OHr90dPuZR3T6jlqhzfuStPgDW71
+cKzCvfFu85KVXqnwoWWVk40CAwEAAaN9MHswHQYDVR0OBBYEFMDnhL/oWSczELBS
+T1FSLwbWwHrNMB8GA1UdIwQYMBaAFHB/Lq6DaFmYBCMqzes+F80k3QFJMAkGA1Ud
+EwQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwGQYDVR0RBBIwEIIOc2VydmVyLmV4
+YW1wbGUwDQYJKoZIhvcNAQELBQADggEBAHvTBEN1ig8RrsT716Ginv4gGNX0LzGI
+RrZ1jO7lm5emuaPNYJpGw0iX5Zdo91qGNXPZaZ75X3S55pQTActq3OPEBOll2pyk
+iyjz+Zp/v5cfRZLlBbFW5gv2R94eibYr4U3fSn4B0yPcl4xH/l/HzJhGDsSDW8qK
+8VIJvmvsPwmL0JMCv+FR59F+NFYZdND/KCXet59WUpF9ICmFCoBEX3EyJXEPwhbi
+X2sdPzJbCjx0HLli8e0HUKNttLQxCsBTRGo6iISLLamwN47mGDa9miBADwGSiz2q
+YeeuLO02zToHhnQ6KbPXOrQAqcL1kngO4g+j/ru+4AZThFkdkGnltvk=
+-----END CERTIFICATE-----
+------------------
+ No extensions
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 281
+ Inner Content Type = Handshake (22)
+ CertificateVerify, Length=260
+ Signature Algorithm: rsa_pss_rsae_sha256 (0x0804)
+ Signature (len=256): ?
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 53
+ Inner Content Type = Handshake (22)
+ Finished, Length=32
+ verify_data (len=32): ?
+
+Sent TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ChangeCipherSpec (20)
+ Length = 1
+ change_cipher_spec (1)
+
+Sent TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 53
+ Inner Content Type = Handshake (22)
+ Finished, Length=32
+ verify_data (len=32): ?
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 234
+ Inner Content Type = Handshake (22)
+ NewSessionTicket, Length=213
+ ticket_lifetime_hint=7200
+ ticket_age_add=?
+ ticket_nonce (len=8): ?
+ ticket (len=192): ?
+ No extensions
+
+Received TLS Record
+Header:
+ Version = TLS 1.2 (0x303)
+ Content Type = ApplicationData (23)
+ Length = 234
+ Inner Content Type = Handshake (22)
+ NewSessionTicket, Length=213
+ ticket_lifetime_hint=7200
+ ticket_age_add=?
+ ticket_nonce (len=8): ?
+ ticket (len=192): ?
+ No extensions
+
diff --git a/crypto/openssl/test/sslapitest.c b/crypto/openssl/test/sslapitest.c
index b83dd6c552de..fbe284b9ff1e 100644
--- a/crypto/openssl/test/sslapitest.c
+++ b/crypto/openssl/test/sslapitest.c
@@ -98,6 +98,7 @@ static char *privkey8192 = NULL;
static char *srpvfile = NULL;
static char *tmpfilename = NULL;
static char *dhfile = NULL;
+static char *datadir = NULL;
static int is_fips = 0;
static int fips_ems_check = 0;
@@ -120,6 +121,15 @@ static X509 *ocspcert = NULL;
#define CLIENT_VERSION_LEN 2
+/* The ssltrace test assumes some options are switched on/off */
+#if !defined(OPENSSL_NO_SSL_TRACE) \
+ && defined(OPENSSL_NO_BROTLI) && defined(OPENSSL_NO_ZSTD) \
+ && !defined(OPENSSL_NO_ECX) && !defined(OPENSSL_NO_DH) \
+ && !defined(OPENSSL_NO_ML_DSA) && !defined(OPENSSL_NO_ML_KEM) \
+ && !defined(OPENSSL_NO_TLS1_3)
+# define DO_SSL_TRACE_TEST
+#endif
+
/*
* This structure is used to validate that the correct number of log messages
* of various types are emitted when emitting secret logs.
@@ -13269,6 +13279,77 @@ static int test_no_renegotiation(int idx)
return testresult;
}
+#if defined(DO_SSL_TRACE_TEST)
+/*
+ * Tests that the SSL_trace() msg_callback works as expected with a PQ Groups.
+ */
+static int test_ssl_trace(void)
+{
+ SSL_CTX *sctx = NULL, *cctx = NULL;
+ SSL *serverssl = NULL, *clientssl = NULL;
+ int testresult = 0;
+ BIO *bio = NULL;
+ char *reffile = NULL;
+ char *grouplist = "MLKEM512:MLKEM768:MLKEM1024:X25519MLKEM768:SecP256r1MLKEM768"
+ ":SecP384r1MLKEM1024:secp521r1:secp384r1:secp256r1";
+
+ if (!fips_provider_version_ge(libctx, 3, 5, 0))
+ return TEST_skip("FIPS provider does not support MLKEM algorithms");
+
+ if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(),
+ TLS_client_method(),
+ TLS1_3_VERSION, TLS1_3_VERSION,
+ &sctx, &cctx, cert, privkey))
+ || !TEST_ptr(bio = BIO_new(BIO_s_mem()))
+ || !TEST_true(SSL_CTX_set1_groups_list(sctx, grouplist))
+ || !TEST_true(SSL_CTX_set1_groups_list(cctx, grouplist))
+ || !TEST_true(SSL_CTX_set_ciphersuites(cctx,
+ "TLS_AES_128_GCM_SHA256"))
+ || !TEST_true(SSL_CTX_set_ciphersuites(sctx,
+ "TLS_AES_128_GCM_SHA256"))
+# ifdef SSL_OP_LEGACY_EC_POINT_FORMATS
+ || !TEST_true(SSL_CTX_set_options(cctx, SSL_OP_LEGACY_EC_POINT_FORMATS))
+ || !TEST_true(SSL_CTX_set_options(sctx, SSL_OP_LEGACY_EC_POINT_FORMATS))
+# endif
+ || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
+ NULL, NULL)))
+ goto err;
+
+ SSL_set_msg_callback(clientssl, SSL_trace);
+ SSL_set_msg_callback_arg(clientssl, bio);
+
+ if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
+ goto err;
+
+ /* Skip the comparison of the trace when the fips provider is used. */
+ if (is_fips) {
+ /* Check whether there was something written. */
+ if (!TEST_int_gt(BIO_pending(bio), 0))
+ goto err;
+ } else {
+
+# ifdef OPENSSL_NO_ZLIB
+ reffile = test_mk_file_path(datadir, "ssltraceref.txt");
+# else
+ reffile = test_mk_file_path(datadir, "ssltraceref-zlib.txt");
+# endif
+ if (!TEST_true(compare_with_reference_file(bio, reffile)))
+ goto err;
+ }
+
+ testresult = 1;
+ err:
+ BIO_free(bio);
+ SSL_free(serverssl);
+ SSL_free(clientssl);
+ SSL_CTX_free(sctx);
+ SSL_CTX_free(cctx);
+ OPENSSL_free(reffile);
+
+ return testresult;
+}
+#endif
+
OPT_TEST_DECLARE_USAGE("certfile privkeyfile srpvfile tmpfile provider config dhfile\n")
int setup_tests(void)
@@ -13303,6 +13384,8 @@ int setup_tests(void)
|| !TEST_ptr(dhfile = test_get_argument(5)))
return 0;
+ datadir = test_get_argument(6);
+
if (!TEST_true(OSSL_LIB_CTX_load_config(libctx, configfile)))
return 0;
@@ -13598,6 +13681,10 @@ int setup_tests(void)
ADD_TEST(test_quic_tls_early_data);
#endif
ADD_ALL_TESTS(test_no_renegotiation, 2);
+#if defined(DO_SSL_TRACE_TEST)
+ if (datadir != NULL)
+ ADD_TEST(test_ssl_trace);
+#endif
return 1;
err:
diff --git a/crypto/openssl/test/testutil.h b/crypto/openssl/test/testutil.h
index f02dcdfba6f9..a262d9371955 100644
--- a/crypto/openssl/test/testutil.h
+++ b/crypto/openssl/test/testutil.h
@@ -652,4 +652,6 @@ X509 *load_cert_der(const unsigned char *bytes, int len);
STACK_OF(X509) *load_certs_pem(const char *file);
X509_REQ *load_csr_der(const char *file, OSSL_LIB_CTX *libctx);
time_t test_asn1_string_to_time_t(const char *asn1_string);
+
+int compare_with_reference_file(BIO *membio, const char *reffile);
#endif /* OSSL_TESTUTIL_H */
diff --git a/crypto/openssl/test/testutil/compare.c b/crypto/openssl/test/testutil/compare.c
new file mode 100644
index 000000000000..067fb878b58e
--- /dev/null
+++ b/crypto/openssl/test/testutil/compare.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2017-2025 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include "../testutil.h"
+
+static void strip_line_ends(char *str)
+{
+ size_t i;
+
+ for (i = strlen(str);
+ i > 0 && (str[i - 1] == '\n' || str[i - 1] == '\r');
+ i--);
+
+ str[i] = '\0';
+}
+
+int compare_with_reference_file(BIO *membio, const char *reffile)
+{
+ BIO *file = NULL, *newfile = NULL;
+ char buf1[8192], buf2[8192];
+ int ret = 0;
+ size_t i;
+
+ if (!TEST_ptr(reffile))
+ goto err;
+
+ file = BIO_new_file(reffile, "rb");
+ if (!TEST_ptr(file))
+ goto err;
+
+ newfile = BIO_new_file("ssltraceref-new.txt", "wb");
+ if (!TEST_ptr(newfile))
+ goto err;
+
+ while (BIO_gets(membio, buf2, sizeof(buf2)) > 0)
+ if (BIO_puts(newfile, buf2) <= 0) {
+ TEST_error("Failed writing new file data");
+ goto err;
+ }
+
+ if (!TEST_int_ge(BIO_seek(membio, 0), 0))
+ goto err;
+
+ while (BIO_gets(file, buf1, sizeof(buf1)) > 0) {
+ size_t line_len;
+
+ if (BIO_gets(membio, buf2, sizeof(buf2)) <= 0) {
+ TEST_error("Failed reading mem data");
+ goto err;
+ }
+ strip_line_ends(buf1);
+ strip_line_ends(buf2);
+ line_len = strlen(buf1);
+ if (line_len > 0 && buf1[line_len - 1] == '?') {
+ /* Wildcard at the EOL means ignore anything after it */
+ if (strlen(buf2) > line_len)
+ buf2[line_len] = '\0';
+ }
+ if (line_len != strlen(buf2)) {
+ TEST_error("Actual and ref line data length mismatch");
+ TEST_info("%s", buf1);
+ TEST_info("%s", buf2);
+ goto err;
+ }
+ for (i = 0; i < line_len; i++) {
+ /* '?' is a wild card character in the reference text */
+ if (buf1[i] == '?')
+ buf2[i] = '?';
+ }
+ if (!TEST_str_eq(buf1, buf2))
+ goto err;
+ }
+ if (!TEST_true(BIO_eof(file))
+ || !TEST_true(BIO_eof(membio)))
+ goto err;
+
+ ret = 1;
+ err:
+ BIO_free(file);
+ BIO_free(newfile);
+ return ret;
+}
diff --git a/crypto/openssl/test/threadstest.c b/crypto/openssl/test/threadstest.c
index 38401911d87f..d33ad46999c6 100644
--- a/crypto/openssl/test/threadstest.c
+++ b/crypto/openssl/test/threadstest.c
@@ -183,13 +183,16 @@ static void rwreader_fn(int *iterations)
CRYPTO_atomic_add(&rwwriter2_done, 0, &lw2, atomiclock);
count++;
- if (rwwriter_ptr != NULL && old > *rwwriter_ptr) {
- TEST_info("rwwriter pointer went backwards\n");
- rw_torture_result = 0;
+ if (rwwriter_ptr != NULL) {
+ if (old > *rwwriter_ptr) {
+ TEST_info("rwwriter pointer went backwards! %d : %d\n",
+ old, *rwwriter_ptr);
+ rw_torture_result = 0;
+ }
+ old = *rwwriter_ptr;
}
if (CRYPTO_THREAD_unlock(rwtorturelock) == 0)
abort();
- *iterations = count;
if (rw_torture_result == 0) {
*iterations = count;
return;
diff --git a/crypto/openssl/test/wpackettest.c b/crypto/openssl/test/wpackettest.c
index bd696e007407..c6d6faf5c485 100644
--- a/crypto/openssl/test/wpackettest.c
+++ b/crypto/openssl/test/wpackettest.c
@@ -588,7 +588,7 @@ static int test_WPACKET_quic_vlint_random(void)
for (i = 0; i < 10000; ++i) {
if (!TEST_int_gt(RAND_bytes(rand_data, sizeof(rand_data)), 0))
- return cleanup(&pkt);
+ return 0;
memcpy(&expected, rand_data, sizeof(expected));
diff --git a/include/resolv.h b/include/resolv.h
index f32f52bab431..6ef79601b5f8 100644
--- a/include/resolv.h
+++ b/include/resolv.h
@@ -188,7 +188,7 @@ struct __res_state {
struct __res_state_ext *ext; /*%< extension for IPv6 */
} _ext;
} _u;
- u_char *_rnd; /*%< PRIVATE: random state */
+ u_char *_rnd; /*%< PRIVATE: random state (unused) */
};
typedef struct __res_state *res_state;
@@ -380,7 +380,6 @@ extern const struct res_sym __p_rcode_syms[];
#define res_nisourserver __res_nisourserver
#define res_ownok __res_ownok
#define res_queriesmatch __res_queriesmatch
-#define res_rndinit __res_rndinit
#define res_randomid __res_randomid
#define res_nrandomid __res_nrandomid
#define sym_ntop __sym_ntop
@@ -445,7 +444,6 @@ int dn_count_labels(const char *);
int dn_comp(const char *, u_char *, int, u_char **, u_char **);
int dn_expand(const u_char *, const u_char *, const u_char *,
char *, int);
-void res_rndinit(res_state);
u_int res_randomid(void);
u_int res_nrandomid(res_state);
int res_nameinquery(const char *, int, int, const u_char *,
diff --git a/lib/libc/Makefile b/lib/libc/Makefile
index d0c254e33396..8705568f6d34 100644
--- a/lib/libc/Makefile
+++ b/lib/libc/Makefile
@@ -109,7 +109,6 @@ NOASM=
.include "${LIBC_SRCTOP}/inet/Makefile.inc"
.include "${LIBC_SRCTOP}/isc/Makefile.inc"
.include "${LIBC_SRCTOP}/locale/Makefile.inc"
-.include "${LIBC_SRCTOP}/md/Makefile.inc"
.include "${LIBC_SRCTOP}/nameser/Makefile.inc"
.include "${LIBC_SRCTOP}/net/Makefile.inc"
.include "${LIBC_SRCTOP}/nls/Makefile.inc"
diff --git a/lib/libc/gen/fts.3 b/lib/libc/gen/fts.3
index ee558b892c8c..b937607b48e0 100644
--- a/lib/libc/gen/fts.3
+++ b/lib/libc/gen/fts.3
@@ -25,7 +25,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd June 30, 2025
+.Dd October 1, 2025
.Dt FTS 3
.Os
.Sh NAME
@@ -376,7 +376,44 @@ The
.Fa fts_name
field is always
.Dv NUL Ns -terminated .
-.Sh FTS_OPEN
+.Ss Thread Safety
+The
+.Nm
+functions can safely be used in multi-threaded programs provided no
+two threads access the same
+.Vt FTS
+or
+.Vt FTSENT
+structure simultaneously.
+However, unless the
+.Dv FTS_NOCHDIR
+flag was passed to
+.Fn fts_open
+or
+.Fn fts_open_b ,
+calls to
+.Fn fts_read
+and
+.Fn fts_children
+may change the current working directory, which will affect all
+threads.
+Conversely, changing the current working directory either during or
+between calls to
+.Fn fts_read
+or
+.Fn fts_children
+(even in a single-thread program) may cause
+.Nm
+to malfunction unless the
+.Dv FTS_NOCHDIR
+flag was passed to
+.Fn fts_open
+or
+.Fn fts_open_b
+and all paths in
+.Va path_argv
+were absolute.
+.Ss Fn fts_open
The
.Fn fts_open
function takes a pointer to an array of character pointers naming one
@@ -545,7 +582,7 @@ the directory traversal order is in the order listed in
.Fa path_argv
for the root paths, and in the order listed in the directory for
everything else.
-.Sh FTS_OPEN_B
+.Ss Fn fts_open_b
The
.Fn fts_open_b
function is identical to
@@ -554,7 +591,7 @@ except that it takes a block pointer instead of a function pointer.
The block is copied before
.Fn fts_open_b
returns, so the original can safely go out of scope or be released.
-.Sh FTS_READ
+.Ss Fn fts_read
The
.Fn fts_read
function returns a pointer to an
@@ -605,7 +642,7 @@ after the
structure has been returned by the function
.Fn fts_read
in post-order.
-.Sh FTS_CHILDREN
+.Ss Fn fts_children
The
.Fn fts_children
function returns a pointer to an
@@ -679,7 +716,7 @@ and
.Fa fts_namelen
fields.
.El
-.Sh FTS_SET
+.Ss Fn fts_set
The function
.Fn fts_set
allows the user application to determine further processing for the
@@ -749,7 +786,7 @@ The file may be one of those most recently returned by either
or
.Fn fts_read .
.El
-.Sh FTS_CLOSE
+.Ss Fn fts_close
The
.Fn fts_close
function closes a file hierarchy stream
diff --git a/lib/libc/include/port_before.h b/lib/libc/include/port_before.h
index cfc43c53f157..aa2cd394104a 100644
--- a/lib/libc/include/port_before.h
+++ b/lib/libc/include/port_before.h
@@ -5,7 +5,6 @@
#define _LIBC 1
#define DO_PTHREADS 1
#define USE_POLL 1
-#define HAVE_MD5 1
#define ISC_SOCKLEN_T socklen_t
#define ISC_FORMAT_PRINTF(fmt, args) \
diff --git a/lib/libc/md/Makefile.inc b/lib/libc/md/Makefile.inc
deleted file mode 100644
index 82c5f0670485..000000000000
--- a/lib/libc/md/Makefile.inc
+++ /dev/null
@@ -1,3 +0,0 @@
-.PATH: ${SRCTOP}/sys/kern
-
-SRCS+= md5c.c
diff --git a/lib/libc/resolv/Symbol.map b/lib/libc/resolv/Symbol.map
index 6b9c43298fb5..26daecbe2eff 100644
--- a/lib/libc/resolv/Symbol.map
+++ b/lib/libc/resolv/Symbol.map
@@ -103,6 +103,5 @@ FBSD_1.0 {
};
FBSD_1.4 {
- __res_rndinit;
__res_nrandomid;
};
diff --git a/lib/libc/resolv/res_init.c b/lib/libc/resolv/res_init.c
index 71ab2dcb7038..5a2fce013c8c 100644
--- a/lib/libc/resolv/res_init.c
+++ b/lib/libc/resolv/res_init.c
@@ -86,19 +86,6 @@
#include <unistd.h>
#include <netdb.h>
-#ifndef HAVE_MD5
-# include "../dst/md5.h"
-#else
-# ifdef SOLARIS2
-# include <sys/md5.h>
-# elif _LIBC
-# include <md5.h>
-# endif
-#endif
-#ifndef _MD5_H_
-# define _MD5_H_ 1 /*%< make sure we do not include rsaref md5.h file */
-#endif
-
#include "un-namespace.h"
#include "port_after.h"
@@ -184,8 +171,6 @@ __res_vinit(res_state statp, int preinit) {
statp->options = RES_DEFAULT;
}
- statp->_rnd = malloc(16);
- res_rndinit(statp);
statp->id = res_nrandomid(statp);
memset(u, 0, sizeof(u));
@@ -733,48 +718,18 @@ net_mask(struct in_addr in) /*!< XXX - should really use system's version of th
}
#endif
-static u_char srnd[16];
-
void
-res_rndinit(res_state statp)
+freebsd15_res_rndinit(res_state statp)
{
- struct timeval now;
- u_int32_t u32;
- u_int16_t u16;
- u_char *rnd = statp->_rnd == NULL ? srnd : statp->_rnd;
-
- gettimeofday(&now, NULL);
- u32 = now.tv_sec;
- memcpy(rnd, &u32, 4);
- u32 = now.tv_usec;
- memcpy(rnd + 4, &u32, 4);
- u32 += now.tv_sec;
- memcpy(rnd + 8, &u32, 4);
- u16 = getpid();
- memcpy(rnd + 12, &u16, 2);
+ (void)statp;
}
+__sym_compat(__res_rndinit, freebsd15_res_rndinit, FBSD_1.4);
u_int
res_nrandomid(res_state statp) {
- struct timeval now;
- u_int16_t u16;
- MD5_CTX ctx;
- u_char *rnd = statp->_rnd == NULL ? srnd : statp->_rnd;
-
- gettimeofday(&now, NULL);
- u16 = (u_int16_t) (now.tv_sec ^ now.tv_usec);
- memcpy(rnd + 14, &u16, 2);
-#ifndef HAVE_MD5
- MD5_Init(&ctx);
- MD5_Update(&ctx, rnd, 16);
- MD5_Final(rnd, &ctx);
-#else
- MD5Init(&ctx);
- MD5Update(&ctx, rnd, 16);
- MD5Final(rnd, &ctx);
-#endif
- memcpy(&u16, rnd + 14, 2);
- return ((u_int) u16);
+ (void) statp;
+
+ return ((u_int)(arc4random() & 0xffff));
}
/*%
@@ -808,10 +763,6 @@ res_ndestroy(res_state statp) {
free(statp->_u._ext.ext);
statp->_u._ext.ext = NULL;
}
- if (statp->_rnd != NULL) {
- free(statp->_rnd);
- statp->_rnd = NULL;
- }
statp->options &= ~RES_INIT;
}
diff --git a/libexec/flua/Makefile b/libexec/flua/Makefile
index cc750e30525f..23de404710d0 100644
--- a/libexec/flua/Makefile
+++ b/libexec/flua/Makefile
@@ -16,7 +16,6 @@ FLUA_MODULES+= libjail
.endif
FLUA_MODULES+= libucl
FLUA_MODULES+= liblyaml
-FLUA_MODULES+= lposix
.ifdef BOOTSTRAPPING
# libfreebsd is generally omitted from the bootstrap flua because its
@@ -55,6 +54,7 @@ SRCS+= lua.c
# FreeBSD Extensions
.PATH: ${.CURDIR}/modules
SRCS+= linit_flua.c
+SRCS+= lposix.c
CFLAGS+= -I${SRCTOP}/lib/liblua -I${.CURDIR}/modules -I${LUASRC}
CFLAGS+= -DLUA_PROGNAME="\"${PROG}\""
diff --git a/libexec/flua/linit_flua.c b/libexec/flua/linit_flua.c
index bb3748daefb4..65356c938671 100644
--- a/libexec/flua/linit_flua.c
+++ b/libexec/flua/linit_flua.c
@@ -33,6 +33,7 @@
#include "lualib.h"
#include "lauxlib.h"
+#include "lposix.h"
#include "bootstrap.h"
@@ -54,6 +55,8 @@ static const luaL_Reg loadedlibs[] = {
#if defined(LUA_COMPAT_BITLIB)
{LUA_BITLIBNAME, luaopen_bit32},
#endif
+ /* FreeBSD Extensions */
+ {"posix", luaopen_posix},
{NULL, NULL}
};
diff --git a/libexec/flua/lposix/Makefile b/libexec/flua/lposix/Makefile
deleted file mode 100644
index 92321d51be9a..000000000000
--- a/libexec/flua/lposix/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-SHLIB_NAME= posix.so
-WARNS?= 3
-
-.include "Makefile.inc"
-.include <bsd.lib.mk>
diff --git a/libexec/flua/lposix/Makefile.inc b/libexec/flua/lposix/Makefile.inc
deleted file mode 100644
index 499e6779e84d..000000000000
--- a/libexec/flua/lposix/Makefile.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-.PATH: ${.PARSEDIR}
-SRCS+= lposix.c
diff --git a/libexec/flua/lposix/lposix.c b/libexec/flua/modules/lposix.c
index 430bb6f28baf..75cdd345aeaa 100644
--- a/libexec/flua/lposix/lposix.c
+++ b/libexec/flua/modules/lposix.c
@@ -21,8 +21,6 @@
#include "lauxlib.h"
#include "lposix.h"
-#include "bootstrap.h"
-
static void
enforce_max_args(lua_State *L, int max)
{
@@ -699,6 +697,3 @@ luaopen_posix(lua_State *L)
return (1);
}
-
-/* Only this one needed in our bootstrap set, it will load the others. */
-FLUA_MODULE(posix);
diff --git a/libexec/flua/lposix/lposix.h b/libexec/flua/modules/lposix.h
index 1aa33f042571..1aa33f042571 100644
--- a/libexec/flua/lposix/lposix.h
+++ b/libexec/flua/modules/lposix.h
diff --git a/libexec/nuageinit/nuageinit b/libexec/nuageinit/nuageinit
index 29340a3d91ea..f29fa8ba1bac 100755
--- a/libexec/nuageinit/nuageinit
+++ b/libexec/nuageinit/nuageinit
@@ -6,6 +6,7 @@
-- Copyright(c) 2025 Jesús Daniel Colmenares Oviedo <dtxdf@FreeBSD.org>
local nuage = require("nuage")
+local lfs = require("lfs")
local ucl = require("ucl")
local yaml = require("lyaml")
diff --git a/release/Makefile.mirrors b/release/Makefile.mirrors
index 958ac7717616..6778b86873e6 100644
--- a/release/Makefile.mirrors
+++ b/release/Makefile.mirrors
@@ -63,10 +63,12 @@ STAGE_TARGETS+= oci-images-stage
OCI_DIR= ${TLD}/OCI-IMAGES/${REVISION}-${BRANCH}/${TARGET_ARCH}
.endif
+.if !defined(EMBEDDED) || empty(EMBEDDED)
.if !defined(NOPKGBASE) || empty(NOPKGBASE)
STAGE_TARGETS+= pkgbase-repo-stage
PKGBASE_DIR= ${TLD}/PKGBASE-REPOS/${REVISION}-${BRANCH}/${TARGET_ARCH}
.endif
+.endif
CLEANFILES+= ${STAGE_TARGETS}
CHECKSUM_FILES?= SHA512 SHA256
diff --git a/release/scripts/make-pkg-package.sh b/release/scripts/make-pkg-package.sh
index a1e006bd6964..3a1b163bd591 100755
--- a/release/scripts/make-pkg-package.sh
+++ b/release/scripts/make-pkg-package.sh
@@ -8,6 +8,13 @@ PKG_ABI=$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI)
unset PKG_VERSION
unset MAKEFLAGS
unset PKGBASE
+# Ports interprets CROSS_TOOLCHAIN differently from src, and having this set
+# breaks the package-pkg build. For now, forcibly unset this and hope ports
+# can find a working compiler.
+if [ -n "$CROSS_TOOLCHAIN" ]; then
+ printf >&2 '%s: WARNING: CROSS_TOOLCHAIN will be ignored for the pkg build.\n' "$0"
+ unset CROSS_TOOLCHAIN
+fi
export WRKDIRPREFIX=/tmp/ports.${TARGET}
export DISTDIR=/tmp/distfiles
export WRKDIR=$(make -C ${PORTSDIR}/ports-mgmt/pkg I_DONT_CARE_IF_MY_BUILDS_TARGET_THE_WRONG_RELEASE=YES -V WRKDIR)
diff --git a/release/tools/vagrant.conf b/release/tools/vagrant.conf
index 7ab0e1238693..5b0f38b740a6 100644
--- a/release/tools/vagrant.conf
+++ b/release/tools/vagrant.conf
@@ -14,14 +14,16 @@ export VM_EXTRA_PACKAGES="${VM_EXTRA_PACKAGES} shells/bash \
export VM_RC_LIST="firstboot_freebsd_update firstboot_pkgs growfs"
vagrant_common () {
- # The firstboot_pkgs rc.d script will download the repository
- # catalogue and install or update pkg when the instance first
- # launches, so these files would just be replaced anyway; removing
- # them from the image allows it to boot faster.
- env ASSUME_ALWAYS_YES=yes pkg -c ${DESTDIR} clean -y -a
- env ASSUME_ALWAYS_YES=yes pkg -c ${DESTDIR} delete -f -y pkg
- rm -r ${DESTDIR}/var/db/pkg/repos/FreeBSD-ports
- rm -r ${DESTDIR}/var/db/pkg/repos/FreeBSD-ports-kmods
+ if [ -z "${NO_ROOT}" ]; then
+ # The firstboot_pkgs rc.d script will download the repository
+ # catalogue and install or update pkg when the instance first
+ # launches, so these files would just be replaced anyway;
+ # removing them from the image allows it to boot faster.
+ pkg -c ${DESTDIR} clean -y -a
+ pkg -c ${DESTDIR} delete -f -y pkg
+ rm -r ${DESTDIR}/var/db/pkg/repos/FreeBSD-ports
+ rm -r ${DESTDIR}/var/db/pkg/repos/FreeBSD-ports-kmods
+ fi
# Vagrant instances use DHCP to get their network configuration.
echo 'ifconfig_DEFAULT="SYNCDHCP"' >> ${DESTDIR}/etc/rc.conf
@@ -40,8 +42,7 @@ vagrant_common () {
# Create the vagrant user with a password of vagrant
/usr/sbin/pw -R ${DESTDIR} \
groupadd vagrant -g 1001
- chroot ${DESTDIR} mkdir -p /home/vagrant
- /usr/sbin/pw -R ${DESTDIR} \
+ /usr/sbin/pw -R ${DESTDIR} -M ${DESTDIR}/METALOG \
useradd vagrant \
-m -M 0755 -w yes -n vagrant -u 1001 -g 1001 -G 0 \
-c 'Vagrant User' -d '/home/vagrant' -s '/bin/csh'
@@ -58,11 +59,11 @@ vagrant_common () {
echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key" > ${DESTDIR}/home/vagrant/.ssh/authorized_keys
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN1YdxBpNlzxDqfJyw/QKow1F+wvG9hXGoqiysfJOn5Y vagrant insecure public key" >> ${DESTDIR}/home/vagrant/.ssh/authorized_keys
chmod 600 ${DESTDIR}/home/vagrant/.ssh/authorized_keys
- metalog_add_data ./home/vagrant/.ssh/authorized_keys 0600
chmod 700 ${DESTDIR}/home/vagrant/.ssh
chown -R 1001 ${DESTDIR}/home/vagrant/.ssh
- echo "./home/vagrant/.ssh type=dir uid=1001 gid=1001 mode=0700" >> METALOG
+ echo "./home/vagrant/.ssh type=dir uid=1001 gid=1001 mode=0700" >> ${DESTDIR}/METALOG
+ echo "./home/vagrant/.ssh/authorized_keys type=file uid=1001 gid=1001 mode=0600" >> ${DESTDIR}/METALOG
# Reboot quickly, Don't wait at the panic screen
echo 'debug.trace_on_panic=1' >> ${DESTDIR}/etc/sysctl.conf
diff --git a/share/man/man4/ice.4 b/share/man/man4/ice.4
index 3f7a9017756d..13ad304a2d5a 100644
--- a/share/man/man4/ice.4
+++ b/share/man/man4/ice.4
@@ -1,4 +1,4 @@
-.\"-
+.\"
.\" SPDX-License-Identifier: BSD-3-Clause
.\"
.\" Copyright (c) 2019-2020, Intel Corporation
@@ -32,12 +32,12 @@
.\"
.\" * Other names and brands may be claimed as the property of others.
.\"
-.Dd March 28, 2025
+.Dd October 3, 2025
.Dt ICE 4
.Os
.Sh NAME
.Nm ice
-.Nd "Intel\(rg Ethernet 800 Series Driver"
+.Nd Intel Ethernet 800 Series Driver
.Sh SYNOPSIS
To compile this driver into the kernel, place the following lines in your
kernel configuration file:
@@ -86,7 +86,7 @@ Intel\(rg Ethernet Connection E830\-XXV
.El
.Pp
For questions related to hardware requirements, refer to the documentation
-supplied with your adapter.
+supplied with the adapter.
.Pp
Support for Jumbo Frames is provided via the interface MTU setting.
Selecting an MTU larger than 1500 bytes with the
@@ -134,17 +134,16 @@ See the
.Dq Intel\(rg Ethernet Adapters and Devices User Guide
for more details on DDP and Safe Mode.
.Pp
-If you encounter issues with the DDP package file, you may need to download
-an updated driver or
+If issues are encountered with the DDP package file, an updated driver or
.Sy ice_ddp
-module.
+module may need to be downloaded.
See the log messages for more information.
.Pp
-You cannot update the DDP package if any PF drivers are already loaded.
+The DDP package cannot be updated if any PF drivers are already loaded.
To overwrite a package, unload all PFs and then reload the driver with the
new package.
.Pp
-You can only use one DDP package per driver, even if you have more than one
+Only one DDP package can be used per driver, even if more than one
device installed that uses the driver.
.Pp
Only the first loaded PF per device can download a package for that device.
@@ -164,9 +163,9 @@ each jumbo packet.
This should help to avoid buffer starvation issues when allocating receive
packets.
.Pp
-Packet loss may have a greater impact on throughput when you use jumbo
-frames.
-If you observe a drop in performance after enabling jumbo frames, enabling
+Packet loss may have a greater impact on throughput when jumbo frames are in
+use.
+If a drop in performance is observed after enabling jumbo frames, enabling
flow control may mitigate the issue.
.Ss Remote Direct Memory Access
Remote Direct Memory Access, or RDMA, allows a network device to transfer data
@@ -184,14 +183,14 @@ operating in multiport mode with more than 4 ports.
For detailed installation and configuration information for RDMA, see
.Xr irdma 4 .
.Ss RDMA Monitoring
-For debugging/testing purposes, you can use sysctl to set up a mirroring
+For debugging/testing purposes, a sysctl can be used to set up a mirroring
interface on a port.
The interface can receive mirrored RDMA traffic for packet
analysis tools like
.Xr tcpdump 1 .
This mirroring may impact performance.
.Pp
-To use RDMA monitoring, you may need to reserve more MSI\-X interrupts.
+To use RDMA monitoring, more MSI\-X interrupts may need to be reserved.
Before the
.Nm
driver loads, configure the following tunable provided by
@@ -200,7 +199,7 @@ driver loads, configure the following tunable provided by
dev.ice.<interface #>.iflib.use_extra_msix_vectors=4
.Ed
.Pp
-You may need to adjust the number of extra MSI\-X interrupt vectors.
+The number of extra MSI\-X interrupt vectors may need to be adjusted.
.Pp
To create/delete the interface:
.Bd -literal -offset indent
@@ -276,7 +275,7 @@ To enable/disable priority flow control in software\-based DCBX mode:
sysctl dev.ice.<interface #>.pfc=1 (or 0 to disable)
.Ed
.Pp
-Enhanced Transmission Selection (ETS) allows you to assign bandwidth to certain
+Enhanced Transmission Selection (ETS) allows bandwidth to be assigned to certain
TCs, to help ensure traffic reliability.
To view the assigned ETS configuration, use the following:
.Bd -literal -offset indent
@@ -310,7 +309,7 @@ Use the following sysctl to enable or disable L3 QoS:
sysctl dev.ice.<interface #>.pfc_mode=1 (or 0 to disable)
.Ed
.Pp
-If you disable L3 QoS mode, it returns to L2 QoS mode.
+If the L3 QoS mode is disabled, it returns to L2 QoS mode.
.Pp
To map a DSCP value to a traffic class, separate the values by commas.
For example, to map DSCPs 0\-3 and DSCP 8 to DCB TCs 0\-3 and 4, respectively:
@@ -329,7 +328,7 @@ sysctl dev.ice.<interface #>.dscp2tc_map
.Pp
L3 QoS mode is not available when FW\-LLDP is enabled.
.Pp
-You also cannot enable FW\-LLDP if L3 QoS mode is active.
+FW\-LLDP cannot be enabled if L3 QoS mode is active.
.Pp
Disable FW\-LLDP before switching to L3 QoS mode.
.Pp
@@ -355,11 +354,11 @@ To check the current LLDP setting:
sysctl dev.ice.<interface #>.fw_lldp_agent
.Ed
.Pp
-You must enable the UEFI HII LLDP Agent attribute for this setting
+The UEFI HII LLDP Agent attribute must be enabled for this setting
to take effect.
If the
.Dq LLDP AGENT
-attribute is set to disabled, you cannot enable the FW\-LLDP Agent from the
+attribute is set to disabled, the FW\-LLDP Agent cannot be enabled from the
driver.
.Ss Link\-Level Flow Control (LFC)
Ethernet Flow Control (IEEE 802.3x) can be configured with sysctl to enable
@@ -416,11 +415,11 @@ provide a stable link without FEC.
.Pp
For devices to benefit from this feature, link partners must have FEC enabled.
.Pp
-If you enable the sysctl
-.Em allow_no_fec_modules_in_auto
-Auto FEC negotiation will include
+If the
+.Va allow_no_fec_modules_in_auto
+sysctl is enabled Auto FEC negotiation will include
.Dq No FEC
-in case your link partner does not have FEC enabled or is not FEC capable:
+in case the link partner does not have FEC enabled or is not FEC capable:
.Bd -literal -offset indent
sysctl dev.ice.<interface #>.allow_no_fec_modules_in_auto=1
.Ed
@@ -443,16 +442,16 @@ To see the valid FEC modes for the link:
sysctl \-d dev.ice.<interface #>.requested_fec
.Ed
.Ss Speed and Duplex Configuration
-You cannot set duplex or autonegotiation settings.
+The speed and duplex settings cannot be hard set.
.Pp
-To have your device change the speeds it will use in auto-negotiation or
+To have the device change the speeds it will use in auto-negotiation or
force link with:
.Bd -literal -offset indent
sysctl dev.ice.<interface #>.advertise_speed=<mask>
.Ed
.Pp
Supported speeds will vary by device.
-Depending on the speeds your device supports, valid bits used in a speed mask
+Depending on the speeds the device supports, valid bits used in a speed mask
could include:
.Bd -literal -offset indent
0x0 \- Auto
@@ -493,13 +492,13 @@ At a high level, to capture a firmware log:
.It
Set the configuration for the firmware log.
.It
-Perform the necessary steps to generate the issue you are trying to debug.
+Perform the necessary steps to reproduce the issue.
.It
Capture the firmware log.
.It
Stop capturing the firmware log.
.It
-Reset your firmware log settings as needed.
+Reset the firmware log settings as needed.
.It
Work with Customer Support to debug the issue.
.El
@@ -583,8 +582,8 @@ PF Registration (Bit 30)
Module Version (Bit 31)
.El
.Pp
-You can change the verbosity level of the firmware logs.
-You can set only one log level per module, and each level includes the
+The verbosity level of the firmware logs can be modified.
+It is possible to set only one log level per module, and each level includes the
verbosity levels lower than it.
For instance, setting the level to
.Dq normal
@@ -640,8 +639,8 @@ dmesg > log_output
NOTE: Logging a large number of modules or too high of a verbosity level will
add extraneous messages to dmesg and could hinder debug efforts.
.Ss Debug Dump
-Intel\(rg Ethernet 800 Series devices support debug dump, which allows you to
-obtain runtime register values from the firmware for
+Intel\(rg Ethernet 800 Series devices support debug dump, which allows
+gathering of runtime register values from the firmware for
.Dq clusters
of events and then write the results to a single dump file, for debugging
complicated issues in the field.
@@ -654,7 +653,7 @@ stateless snapshot of the whole device.
.Pp
NOTE: Like with firmware logs, the contents of the debug dump are not
human\-readable.
-You must work with Customer Support to decode the file.
+Work with Customer Support to decode the file.
.Pp
Debug dump is per device, not per PF.
.Pp
@@ -717,20 +716,19 @@ sysctl dev.ice.0.debug.dump.clusters=0
.Pp
NOTE: Using 0 will skip Manageability Transactions data.
.Pp
-If you don't specify a cluster, the driver will dump all clusters to a
+If a single cluster is not specified, the driver will dump all clusters to a
single file.
Issue the debug dump command, using the following:
.Bd -literal -offset indent
sysctl \-b dev.ice.<interface #>.debug.dump.dump=1 > dump.bin
.Ed
.Pp
-NOTE: The driver will not receive the command if you do not write
-.Dq 1
-to the sysctl.
+NOTE: The driver will not receive the command if the sysctl is not set to
+.Dq 1 .
.Pp
Replace
.Dq dump.bin
-above with the file name you want to use.
+above with the preferred file name.
.Pp
To clear the
.Va clusters
@@ -744,7 +742,7 @@ The ice driver supports the ability to obtain the values of the PHY registers
from Intel(R) Ethernet 810 Series devices in order to debug link and
connection issues during runtime.
.Pp
-The driver allows you to obtain information about:
+The driver provides information about:
.Bl -bullet
.It
Rx and Tx Equalization parameters
@@ -758,12 +756,12 @@ sysctl dev.ice.<interface #>.debug.phy_statistics
.Ed
.Pp
NOTE: The contents of the registers are not human\-readable.
-Like with firmware logs and debug dump, you must work with Customer Support
+Like with firmware logs and debug dump, work with Customer Support
to decode the file.
.Ss Transmit Balancing
-Some Intel(R) Ethernet 800 Series devices allow you to enable a transmit
+Some Intel(R) Ethernet 800 Series devices allow for enabling a transmit
balancing feature to improve transmit performance under certain conditions.
-When the feature is enabled, you should experience more consistent transmit
+When enabled, the feature should provide more consistent transmit
performance across queues and/or PFs and VFs.
.Pp
By default, transmit balancing is disabled in the NVM.
@@ -784,7 +782,7 @@ configures the device accordingly.
.Pp
NOTE: The user selection for transmit balancing in EPCT or HII is persistent
across reboots.
-You must reboot the system for the selected setting to take effect.
+The system must be rebooted for the selected setting to take effect.
.Pp
This setting is device wide.
.Pp
@@ -801,7 +799,7 @@ sysctl dev.ice.<interface #>.temp
may have a low number of network memory buffers (mbufs) by default.
If the number of mbufs available is too low, it may cause the driver to fail
to initialize and/or cause the system to become unresponsive.
-You can check to see if the system is mbuf\-starved by running
+Check to see if the system is mbuf\-starved by running
.Ic netstat Fl m .
Increase the number of mbufs by editing the lines below in
.Pa /etc/sysctl.conf :
@@ -813,7 +811,7 @@ kern.ipc.nmbjumbo16
kern.ipc.nmbufs
.Ed
.Pp
-The amount of memory that you allocate is system specific, and may require some
+The amount of memory that should be allocated is system specific, and may require some
trial and error.
Also, increasing the following in
.Pa /etc/sysctl.conf
@@ -908,8 +906,8 @@ link partner's switch ports.
Some PCIe x8 slots are actually configured as x4 slots.
These slots have insufficient bandwidth for full line rate with dual port and
quad port devices.
-In addition, if you put a PCIe v4.0 or v3.0\-capable adapter into a PCIe v2.x
-slot, you cannot get full bandwidth.
+In addition, if a PCIe v4.0 or v3.0\-capable adapter is placed into a PCIe v2.x
+slot, full bandwidth will not be possible.
.Pp
The driver detects this situation and writes the following message in the
system log:
@@ -920,7 +918,7 @@ Please move the device to a different PCI\-e link with more lanes and/or
higher transfer rate.
.Ed
.Pp
-If this error occurs, moving your adapter to a true PCIe x8 or x16 slot will
+If this error occurs, moving the adapter to a true PCIe x8 or x16 slot will
resolve the issue.
For best performance, install devices in the following PCI slots:
.Bl -bullet
diff --git a/sys/dev/acpica/acpi_apei.c b/sys/dev/acpica/acpi_apei.c
index 9cfd46c97430..624c81ad1b4f 100644
--- a/sys/dev/acpica/acpi_apei.c
+++ b/sys/dev/acpica/acpi_apei.c
@@ -754,7 +754,7 @@ apei_detach(device_t dev)
apei_nmi = NULL;
apei_nmi_nges = NULL;
if (sc->nges.swi_ih != NULL) {
- swi_remove(&sc->nges.swi_ih);
+ swi_remove(sc->nges.swi_ih);
sc->nges.swi_ih = NULL;
}
if (acpi_get_handle(dev) != NULL) {
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 9e43a4c1909f..cde98cb62cef 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -240,6 +240,7 @@ struct pci_quirk {
#define PCI_QUIRK_DISABLE_MSIX 5 /* MSI-X doesn't work */
#define PCI_QUIRK_MSI_INTX_BUG 6 /* PCIM_CMD_INTxDIS disables MSI */
#define PCI_QUIRK_REALLOC_BAR 7 /* Can't allocate memory at the default address */
+#define PCI_QUIRK_DISABLE_FLR 8 /* Function-Level Reset (FLR) not working. */
int arg1;
int arg2;
};
@@ -319,6 +320,13 @@ static const struct pci_quirk pci_quirks[] = {
* expected place.
*/
{ 0x98741002, PCI_QUIRK_REALLOC_BAR, 0, 0 },
+
+ /*
+ * With some MediaTek mt76 WiFi FLR does not work despite advertised.
+ */
+ { 0x061614c3, PCI_QUIRK_DISABLE_FLR, 0, 0 }, /* mt76 7922 */
+
+ /* end of table */
{ 0 }
};
@@ -6740,6 +6748,8 @@ pcie_flr(device_t dev, u_int max_delay, bool force)
if (!(pci_read_config(dev, cap + PCIER_DEVICE_CAP, 4) & PCIEM_CAP_FLR))
return (false);
+ if (pci_has_quirk(pci_get_devid(dev), PCI_QUIRK_DISABLE_FLR))
+ return (false);
/*
* Disable busmastering to prevent generation of new
diff --git a/sys/dev/vmware/vmxnet3/if_vmx.c b/sys/dev/vmware/vmxnet3/if_vmx.c
index 62b5f313a137..1a314ca6660e 100644
--- a/sys/dev/vmware/vmxnet3/if_vmx.c
+++ b/sys/dev/vmware/vmxnet3/if_vmx.c
@@ -2056,7 +2056,12 @@ vmxnet3_update_admin_status(if_ctx_t ctx)
struct vmxnet3_softc *sc;
sc = iflib_get_softc(ctx);
- if (sc->vmx_ds->event != 0)
+ /*
+ * iflib may invoke this routine before vmxnet3_attach_post() has
+ * run, which is before the top level shared data area is
+ * initialized and the device made aware of it.
+ */
+ if (sc->vmx_ds != NULL && sc->vmx_ds->event != 0)
vmxnet3_evintr(sc);
vmxnet3_refresh_host_stats(sc);
diff --git a/tools/test/stress2/misc/all.exclude b/tools/test/stress2/misc/all.exclude
index f9b32db95799..0658bfdc0c1b 100644
--- a/tools/test/stress2/misc/all.exclude
+++ b/tools/test/stress2/misc/all.exclude
@@ -25,6 +25,7 @@ gnop13.sh https://people.freebsd.org/~pho/stress/log/log0386.txt 20221113
gnop7.sh Waiting for patch commit 20190820
gnop8.sh Waiting for patch commit 20201214
gnop9.sh Waiting for patch commit 20201214
+graid1_3.sh Hang seen 20250915
graid1_8.sh Known issue 20170909
graid1_9.sh panic: Bad effnlink 20180212
lockf5.sh Spinning threads seen 20160718
@@ -74,10 +75,13 @@ syzkaller67.sh panic: ASan: Invalid access, 8-byte read at ... 20230621
syzkaller80.sh panic 20250711
syzkaller81.sh panic 20250711
syzkaller82.sh panic: m_apply, length > size of mbuf chain 20250724
+syzkaller84.sh panic: Assertion !(sb->sb_state & SBS_CANTRCVMORE) 20250810
+syzkaller85.sh panic: Assertion uio->uio_resid < 0 failed 20250928
+syzkaller86.sh Fatal trap 12: page fault while in kernel mode 20251001
+write2.sh panic: sndbuf_acquire: count 255 > free 0 20251003
quota3.sh https://people.freebsd.org/~pho/stress/log/log0604.txt 20250728
quota6.sh https://people.freebsd.org/~pho/stress/log/log0456.txt 20240707
truss3.sh WiP 20200915
-zfs18.sh https://people.freebsd.org/~pho/stress/log/log0560.txt 20241118
zfs9.sh panic: sacked_bytes < 0 20250711
# Test not to run for other reasons:
diff --git a/tools/test/stress2/misc/fuzz.sh b/tools/test/stress2/misc/fuzz.sh
index 189cdbfebd01..add3d0d19a21 100755
--- a/tools/test/stress2/misc/fuzz.sh
+++ b/tools/test/stress2/misc/fuzz.sh
@@ -49,6 +49,7 @@
. ../default.cfg
D=$diskimage
+backup=/tmp/fuzz.sh.diskimage.`date +%Y%m%dT%H%M%S`.gz
tst() {
rm -f $D
@@ -62,6 +63,7 @@ tst() {
for i in `jot 50`; do
./fuzz -n 50 $D
+ gzip < $D > $backup
if fsck -f -y /dev/md$mdstart 2>&1 | egrep "^[A-Z]" > /dev/null; then
if fsck -f -y /dev/md$mdstart 2>&1 | egrep "^[A-Z]" > /dev/null; then
if fsck -f -y /dev/md$mdstart 2>&1 | egrep "^[A-Z]" > /dev/null; then
@@ -73,7 +75,7 @@ tst() {
sync;sync;sync
if mount /dev/md$mdstart $mntpoint; then
ls -l $mntpoint > /dev/null
- find $mntpoint -exec dd if={} of=/dev/null bs=1m count=3 \; > /dev/null 2>&1
+ find $mntpoint -type f -exec dd if={} of=/dev/null bs=1m count=3 \; > /dev/null 2>&1
umount $mntpoint
else
echo "Giving up at loop $i"
@@ -96,7 +98,7 @@ for j in `jot 10`; do
date '+%T'
tst
done
-rm -f fuzz
+rm -f fuzz $backup
exit
diff --git a/tools/test/stress2/misc/syzkaller84.sh b/tools/test/stress2/misc/syzkaller84.sh
new file mode 100755
index 000000000000..a7976be2eeb6
--- /dev/null
+++ b/tools/test/stress2/misc/syzkaller84.sh
@@ -0,0 +1,402 @@
+#!/bin/sh
+
+# panic: Assertion !(sb->sb_state & SBS_CANTRCVMORE) failed at ../../../kern/uipc_usrreq.c:1549
+# cpuid = 6
+# time = 1754809105
+# KDB: stack backtrace:
+# db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe0176ef6a80
+# vpanic() at vpanic+0x136/frame 0xfffffe0176ef6bb0
+# panic() at panic+0x43/frame 0xfffffe0176ef6c10
+# uipc_soreceive_stream_or_seqpacket() at uipc_soreceive_stream_or_seqpacket+0x968/frame 0xfffffe0176ef6cd0
+# soreceive() at soreceive+0x45/frame 0xfffffe0176ef6cf0
+# kern_recvit() at kern_recvit+0x181/frame 0xfffffe0176ef6da0
+# sys_recvmsg() at sys_recvmsg+0x67/frame 0xfffffe0176ef6e00
+# amd64_syscall() at amd64_syscall+0x169/frame 0xfffffe0176ef6f30
+# fast_syscall_common() at fast_syscall_common+0xf8/frame 0xfffffe0176ef6f30
+# --- syscall (0, FreeBSD ELF64, syscall), rip = 0x821d3da8a, rsp = 0x824440f68, rbp = 0x824440f90 ---
+# KDB: enter: panic
+# [ thread pid 17448 tid 292963 ]
+# Stopped at kdb_enter+0x33: movq $0,0x12304a2(%rip)
+# db> x/s version
+# version: FreeBSD 15.0-PRERELEASE #0 main-n279510-db7c0e32a05d-dirty: Sat Aug 9 17:21:54 CEST 2025
+# pho@mercat1.netperf.freebsd.org:/usr/src/sys/amd64/compile/PHO
+# db>
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+set -u
+prog=$(basename "$0" .sh)
+cat > /tmp/$prog.c <<EOF
+// https://syzkaller.appspot.com/bug?id=79d6de939eb5c7de69e8e4993b6239aa0ae67335
+// autogenerated by syzkaller (https://github.com/google/syzkaller)
+// syzbot+ffcc3612ea266e36604e@syzkaller.appspotmail.com
+
+#define _GNU_SOURCE
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <pthread.h>
+#include <pwd.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/endian.h>
+#include <sys/resource.h>
+#include <sys/syscall.h>
+#include <sys/wait.h>
+#include <time.h>
+#include <unistd.h>
+
+static unsigned long long procid;
+
+static void kill_and_wait(int pid, int* status)
+{
+ kill(pid, SIGKILL);
+ while (waitpid(-1, status, 0) != pid) {
+ }
+}
+
+static void sleep_ms(uint64_t ms)
+{
+ usleep(ms * 1000);
+}
+
+static uint64_t current_time_ms(void)
+{
+ struct timespec ts;
+ if (clock_gettime(CLOCK_MONOTONIC, &ts))
+ exit(1);
+ return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
+}
+
+static void thread_start(void* (*fn)(void*), void* arg)
+{
+ pthread_t th;
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setstacksize(&attr, 128 << 10);
+ int i = 0;
+ for (; i < 100; i++) {
+ if (pthread_create(&th, &attr, fn, arg) == 0) {
+ pthread_attr_destroy(&attr);
+ return;
+ }
+ if (errno == EAGAIN) {
+ usleep(50);
+ continue;
+ }
+ break;
+ }
+ exit(1);
+}
+
+typedef struct {
+ pthread_mutex_t mu;
+ pthread_cond_t cv;
+ int state;
+} event_t;
+
+static void event_init(event_t* ev)
+{
+ if (pthread_mutex_init(&ev->mu, 0))
+ exit(1);
+ if (pthread_cond_init(&ev->cv, 0))
+ exit(1);
+ ev->state = 0;
+}
+
+static void event_reset(event_t* ev)
+{
+ ev->state = 0;
+}
+
+static void event_set(event_t* ev)
+{
+ pthread_mutex_lock(&ev->mu);
+ if (ev->state)
+ exit(1);
+ ev->state = 1;
+ pthread_mutex_unlock(&ev->mu);
+ pthread_cond_broadcast(&ev->cv);
+}
+
+static void event_wait(event_t* ev)
+{
+ pthread_mutex_lock(&ev->mu);
+ while (!ev->state)
+ pthread_cond_wait(&ev->cv, &ev->mu);
+ pthread_mutex_unlock(&ev->mu);
+}
+
+static int event_isset(event_t* ev)
+{
+ pthread_mutex_lock(&ev->mu);
+ int res = ev->state;
+ pthread_mutex_unlock(&ev->mu);
+ return res;
+}
+
+static int event_timedwait(event_t* ev, uint64_t timeout)
+{
+ uint64_t start = current_time_ms();
+ uint64_t now = start;
+ pthread_mutex_lock(&ev->mu);
+ for (;;) {
+ if (ev->state)
+ break;
+ uint64_t remain = timeout - (now - start);
+ struct timespec ts;
+ ts.tv_sec = remain / 1000;
+ ts.tv_nsec = (remain % 1000) * 1000 * 1000;
+ pthread_cond_timedwait(&ev->cv, &ev->mu, &ts);
+ now = current_time_ms();
+ if (now - start > timeout)
+ break;
+ }
+ int res = ev->state;
+ pthread_mutex_unlock(&ev->mu);
+ return res;
+}
+
+static void sandbox_common()
+{
+ struct rlimit rlim;
+ rlim.rlim_cur = rlim.rlim_max = 128 << 20;
+ setrlimit(RLIMIT_AS, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 8 << 20;
+ setrlimit(RLIMIT_MEMLOCK, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 1 << 20;
+ setrlimit(RLIMIT_FSIZE, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 1 << 20;
+ setrlimit(RLIMIT_STACK, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 0;
+ setrlimit(RLIMIT_CORE, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 256;
+ setrlimit(RLIMIT_NOFILE, &rlim);
+}
+
+static void loop();
+
+static int do_sandbox_none(void)
+{
+ sandbox_common();
+ loop();
+ return 0;
+}
+
+struct thread_t {
+ int created, call;
+ event_t ready, done;
+};
+
+static struct thread_t threads[16];
+static void execute_call(int call);
+static int running;
+
+static void* thr(void* arg)
+{
+ struct thread_t* th = (struct thread_t*)arg;
+ for (;;) {
+ event_wait(&th->ready);
+ event_reset(&th->ready);
+ execute_call(th->call);
+ __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED);
+ event_set(&th->done);
+ }
+ return 0;
+}
+
+static void execute_one(void)
+{
+ if (write(1, "executing program\n", sizeof("executing program\n") - 1)) {
+ }
+ int i, call, thread;
+ for (call = 0; call < 4; call++) {
+ for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0]));
+ thread++) {
+ struct thread_t* th = &threads[thread];
+ if (!th->created) {
+ th->created = 1;
+ event_init(&th->ready);
+ event_init(&th->done);
+ event_set(&th->done);
+ thread_start(thr, th);
+ }
+ if (!event_isset(&th->done))
+ continue;
+ event_reset(&th->done);
+ th->call = call;
+ __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED);
+ event_set(&th->ready);
+ event_timedwait(&th->done, 50);
+ break;
+ }
+ }
+ for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++)
+ sleep_ms(1);
+}
+
+static void execute_one(void);
+
+#define WAIT_FLAGS 0
+
+static void loop(void)
+{
+// int iter = 0;
+ for (;; /*iter++*/) {
+ int pid = fork();
+ if (pid < 0)
+ exit(1);
+ if (pid == 0) {
+ execute_one();
+ exit(0);
+ }
+ int status = 0;
+ uint64_t start = current_time_ms();
+ for (;;) {
+ sleep_ms(10);
+ if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
+ break;
+ if (current_time_ms() - start < 5000)
+ continue;
+ kill_and_wait(pid, &status);
+ break;
+ }
+ }
+}
+
+uint64_t r[2] = {0xffffffffffffffff, 0xffffffffffffffff};
+
+void execute_call(int call)
+{
+ intptr_t res = 0;
+ switch (call) {
+ case 0:
+ // socketpair\$unix arguments: [
+ // domain: const = 0x1 (8 bytes)
+ // type: unix_socket_type = 0x5 (8 bytes)
+ // proto: const = 0x0 (1 bytes)
+ // fds: ptr[out, unix_pair] {
+ // unix_pair {
+ // fd0: sock_unix (resource)
+ // fd1: sock_unix (resource)
+ // }
+ // }
+ // ]
+ res = syscall(SYS_socketpair, /*domain=*/1ul, /*type=SOCK_SEQPACKET*/ 5ul,
+ /*proto=*/0, /*fds=*/0x200000000440ul);
+ if (res != -1) {
+ r[0] = *(uint32_t*)0x200000000440;
+ r[1] = *(uint32_t*)0x200000000444;
+ }
+ break;
+ case 1:
+ // sendmsg arguments: [
+ // fd: sock (resource)
+ // msg: ptr[in, send_msghdr] {
+ // send_msghdr {
+ // msg_name: nil
+ // msg_namelen: len = 0x0 (4 bytes)
+ // pad = 0x0 (4 bytes)
+ // msg_iov: nil
+ // msg_iovlen: len = 0x0 (8 bytes)
+ // msg_control: ptr[inout, array[ANYUNION]] {
+ // array[ANYUNION] {
+ // union ANYUNION {
+ // ANYBLOB: buffer: {04 01 00 00 ff ff 00 00 01} (length 0x9)
+ // }
+ // }
+ // }
+ // msg_controllen: bytesize = 0x104 (8 bytes)
+ // msg_flags: const = 0x0 (4 bytes)
+ // pad = 0x0 (4 bytes)
+ // }
+ // }
+ // f: send_flags = 0x0 (8 bytes)
+ // ]
+ *(uint64_t*)0x200000000000 = 0;
+ *(uint32_t*)0x200000000008 = 0;
+ *(uint64_t*)0x200000000010 = 0;
+ *(uint64_t*)0x200000000018 = 0;
+ *(uint64_t*)0x200000000020 = 0x2000000007c0;
+ memcpy((void*)0x2000000007c0, "\x04\x01\x00\x00\xff\xff\x00\x00\x01", 9);
+ *(uint64_t*)0x200000000028 = 0x104;
+ *(uint32_t*)0x200000000030 = 0;
+ syscall(SYS_sendmsg, /*fd=*/r[1], /*msg=*/0x200000000000ul, /*f=*/0ul);
+ for (int i = 0; i < 32; i++) {
+ syscall(SYS_sendmsg, /*fd=*/r[1], /*msg=*/0x200000000000ul, /*f=*/0ul);
+ }
+ break;
+ case 2:
+ // close arguments: [
+ // fd: fd (resource)
+ // ]
+ syscall(SYS_close, /*fd=*/r[1]);
+ break;
+ case 3:
+ // recvmsg arguments: [
+ // fd: sock (resource)
+ // msg: ptr[inout, recv_msghdr] {
+ // recv_msghdr {
+ // msg_name: nil
+ // msg_namelen: len = 0x0 (4 bytes)
+ // pad = 0x0 (4 bytes)
+ // msg_iov: nil
+ // msg_iovlen: len = 0x0 (8 bytes)
+ // msg_control: ptr[out, buffer] {
+ // buffer: (DirOut)
+ // }
+ // msg_controllen: len = 0x19 (8 bytes)
+ // msg_flags: const = 0x0 (4 bytes)
+ // pad = 0x0 (4 bytes)
+ // }
+ // }
+ // f: recv_flags = 0x80 (8 bytes)
+ // ]
+ *(uint64_t*)0x2000000005c0 = 0;
+ *(uint32_t*)0x2000000005c8 = 0;
+ *(uint64_t*)0x2000000005d0 = 0;
+ *(uint64_t*)0x2000000005d8 = 0;
+ *(uint64_t*)0x2000000005e0 = 0x200000000580;
+ *(uint64_t*)0x2000000005e8 = 0x19;
+ *(uint32_t*)0x2000000005f0 = 0;
+ syscall(SYS_recvmsg, /*fd=*/r[0], /*msg=*/0x2000000005c0ul,
+ /*f=MSG_DONTWAIT*/ 0x80ul);
+ break;
+ }
+}
+int main(void)
+{
+ syscall(SYS_mmap, /*addr=*/0x200000000000ul, /*len=*/0x1000000ul,
+ /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul,
+ /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x1012ul,
+ /*fd=*/(intptr_t)-1, /*offset=*/0ul);
+ const char* reason;
+ (void)reason;
+ for (procid = 0; procid < 4; procid++) {
+ if (fork() == 0) {
+ do_sandbox_none();
+ }
+ }
+ sleep(1000000);
+ return 0;
+}
+EOF
+mycc -o /tmp/$prog -Wall -Wextra -O0 /tmp/$prog.c -pthread || exit 1
+
+work=/tmp/$prog.dir
+rm -rf $work
+mkdir $work
+cd /tmp/$prog.dir
+kldstat | grep -q sctp || { kldload sctp.ko && loaded=1; }
+timeout 3m /tmp/$prog > /dev/null 2>&1
+
+rm -rf /tmp/$prog /tmp/$prog.c /tmp/$prog.core $work
+[ $loaded ] && kldunload sctp.ko
+exit 0
diff --git a/tools/test/stress2/misc/syzkaller85.sh b/tools/test/stress2/misc/syzkaller85.sh
new file mode 100755
index 000000000000..1772c0dc58b8
--- /dev/null
+++ b/tools/test/stress2/misc/syzkaller85.sh
@@ -0,0 +1,499 @@
+#!/bin/sh
+
+# panic: Assertion uio->uio_resid < 0 failed at ../../../netlink/netlink_domain.c:808
+# cpuid = 8
+# time = 1759044376
+# KDB: stack backtrace:
+# db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe0184d17a70
+# vpanic() at vpanic+0x136/frame 0xfffffe0184d17ba0
+# panic() at panic+0x43/frame 0xfffffe0184d17c00
+# nl_soreceive() at nl_soreceive+0x433/frame 0xfffffe0184d17ca0
+# soreceive() at soreceive+0x45/frame 0xfffffe0184d17cc0
+# kern_recvit() at kern_recvit+0x181/frame 0xfffffe0184d17d70
+# sys_recvfrom() at sys_recvfrom+0xa2/frame 0xfffffe0184d17e00
+# amd64_syscall() at amd64_syscall+0x169/frame 0xfffffe0184d17f30
+# fast_syscall_common() at fast_syscall_common+0xf8/frame 0xfffffe0184d17f30
+# --- syscall (0, FreeBSD ELF64, syscall), rip = 0x822882cca, rsp = 0x823572e88, rbp = 0x823572f90 ---
+# KDB: enter: panic
+# [ thread pid 11012 tid 138112 ]
+# Stopped at $0,0x121a722(%rip)
+# db> x/s version
+# version: FreeBSD 16.0-CURRENT #0 main-n280667-52eb7e394a7e-dirty: Sun Sep 28 08:56:14 CEST 2025
+# pho@mercat1.netperf.freebsd.org:/usr/src/sys/amd64/compile/PHO
+# db>
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+set -u
+prog=$(basename "$0" .sh)
+cat > /tmp/$prog.c <<EOF
+// https://syzkaller.appspot.com/bug?id=e33cdff88b17af77553159c4b372cac4e4bcd652
+// autogenerated by syzkaller (https://github.com/google/syzkaller)
+// syzbot+194f95f2c5fdffef1ef5@syzkaller.appspotmail.com
+
+#define _GNU_SOURCE
+
+#include <sys/types.h>
+
+#include <dirent.h>
+#include <errno.h>
+#include <pthread.h>
+#include <pwd.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/endian.h>
+#include <sys/resource.h>
+#include <sys/stat.h>
+#include <sys/syscall.h>
+#include <sys/wait.h>
+#include <time.h>
+#include <unistd.h>
+
+static unsigned long long procid;
+
+static __thread int clone_ongoing;
+static __thread int skip_segv;
+static __thread jmp_buf segv_env;
+
+static void segv_handler(int sig, siginfo_t* info, void* ctx __unused)
+{
+ if (__atomic_load_n(&clone_ongoing, __ATOMIC_RELAXED) != 0) {
+ exit(sig);
+ }
+ uintptr_t addr = (uintptr_t)info->si_addr;
+ const uintptr_t prog_start = 1 << 20;
+ const uintptr_t prog_end = 100 << 20;
+ int skip = __atomic_load_n(&skip_segv, __ATOMIC_RELAXED) != 0;
+ int valid = addr < prog_start || addr > prog_end;
+ if (sig == SIGBUS)
+ valid = 1;
+ if (skip && valid) {
+ _longjmp(segv_env, 1);
+ }
+ exit(sig);
+}
+
+static void install_segv_handler(void)
+{
+ struct sigaction sa;
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_sigaction = segv_handler;
+ sa.sa_flags = SA_NODEFER | SA_SIGINFO;
+ sigaction(SIGSEGV, &sa, NULL);
+ sigaction(SIGBUS, &sa, NULL);
+}
+
+#define NONFAILING(...) \
+ ({ \
+ int ok = 1; \
+ __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST); \
+ if (_setjmp(segv_env) == 0) { \
+ __VA_ARGS__; \
+ } else \
+ ok = 0; \
+ __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST); \
+ ok; \
+ })
+
+static void kill_and_wait(int pid, int* status)
+{
+ kill(pid, SIGKILL);
+ while (waitpid(-1, status, 0) != pid) {
+ }
+}
+
+static void sleep_ms(uint64_t ms)
+{
+ usleep(ms * 1000);
+}
+
+static uint64_t current_time_ms(void)
+{
+ struct timespec ts;
+ if (clock_gettime(CLOCK_MONOTONIC, &ts))
+ exit(1);
+ return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
+}
+
+static void use_temporary_dir(void)
+{
+ char tmpdir_template[] = "./syzkaller.XXXXXX";
+ char* tmpdir = mkdtemp(tmpdir_template);
+ if (!tmpdir)
+ exit(1);
+ if (chmod(tmpdir, 0777))
+ exit(1);
+ if (chdir(tmpdir))
+ exit(1);
+}
+
+static void reset_flags(const char* filename)
+{
+ struct stat st;
+ if (lstat(filename, &st))
+ exit(1);
+ st.st_flags &= ~(SF_NOUNLINK | UF_NOUNLINK | SF_IMMUTABLE | UF_IMMUTABLE |
+ SF_APPEND | UF_APPEND);
+ if (lchflags(filename, st.st_flags))
+ exit(1);
+}
+static void __attribute__((noinline)) remove_dir(const char* dir)
+{
+ DIR* dp = opendir(dir);
+ if (dp == NULL) {
+ if (errno == EACCES) {
+ if (rmdir(dir))
+ exit(1);
+ return;
+ }
+ exit(1);
+ }
+ struct dirent* ep = 0;
+ while ((ep = readdir(dp))) {
+ if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0)
+ continue;
+ char filename[FILENAME_MAX];
+ snprintf(filename, sizeof(filename), "%s/%s", dir, ep->d_name);
+ struct stat st;
+ if (lstat(filename, &st))
+ exit(1);
+ if (S_ISDIR(st.st_mode)) {
+ remove_dir(filename);
+ continue;
+ }
+ if (unlink(filename)) {
+ if (errno == EPERM) {
+ reset_flags(filename);
+ reset_flags(dir);
+ if (unlink(filename) == 0)
+ continue;
+ }
+ exit(1);
+ }
+ }
+ closedir(dp);
+ while (rmdir(dir)) {
+ if (errno == EPERM) {
+ reset_flags(dir);
+ if (rmdir(dir) == 0)
+ break;
+ }
+ exit(1);
+ }
+}
+
+static void thread_start(void* (*fn)(void*), void* arg)
+{
+ pthread_t th;
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setstacksize(&attr, 128 << 10);
+ int i = 0;
+ for (; i < 100; i++) {
+ if (pthread_create(&th, &attr, fn, arg) == 0) {
+ pthread_attr_destroy(&attr);
+ return;
+ }
+ if (errno == EAGAIN) {
+ usleep(50);
+ continue;
+ }
+ break;
+ }
+ exit(1);
+}
+
+typedef struct {
+ pthread_mutex_t mu;
+ pthread_cond_t cv;
+ int state;
+} event_t;
+
+static void event_init(event_t* ev)
+{
+ if (pthread_mutex_init(&ev->mu, 0))
+ exit(1);
+ if (pthread_cond_init(&ev->cv, 0))
+ exit(1);
+ ev->state = 0;
+}
+
+static void event_reset(event_t* ev)
+{
+ ev->state = 0;
+}
+
+static void event_set(event_t* ev)
+{
+ pthread_mutex_lock(&ev->mu);
+ if (ev->state)
+ exit(1);
+ ev->state = 1;
+ pthread_mutex_unlock(&ev->mu);
+ pthread_cond_broadcast(&ev->cv);
+}
+
+static void event_wait(event_t* ev)
+{
+ pthread_mutex_lock(&ev->mu);
+ while (!ev->state)
+ pthread_cond_wait(&ev->cv, &ev->mu);
+ pthread_mutex_unlock(&ev->mu);
+}
+
+static int event_isset(event_t* ev)
+{
+ pthread_mutex_lock(&ev->mu);
+ int res = ev->state;
+ pthread_mutex_unlock(&ev->mu);
+ return res;
+}
+
+static int event_timedwait(event_t* ev, uint64_t timeout)
+{
+ uint64_t start = current_time_ms();
+ uint64_t now = start;
+ pthread_mutex_lock(&ev->mu);
+ for (;;) {
+ if (ev->state)
+ break;
+ uint64_t remain = timeout - (now - start);
+ struct timespec ts;
+ ts.tv_sec = remain / 1000;
+ ts.tv_nsec = (remain % 1000) * 1000 * 1000;
+ pthread_cond_timedwait(&ev->cv, &ev->mu, &ts);
+ now = current_time_ms();
+ if (now - start > timeout)
+ break;
+ }
+ int res = ev->state;
+ pthread_mutex_unlock(&ev->mu);
+ return res;
+}
+
+static void sandbox_common()
+{
+ struct rlimit rlim;
+ rlim.rlim_cur = rlim.rlim_max = 128 << 20;
+ setrlimit(RLIMIT_AS, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 8 << 20;
+ setrlimit(RLIMIT_MEMLOCK, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 1 << 20;
+ setrlimit(RLIMIT_FSIZE, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 1 << 20;
+ setrlimit(RLIMIT_STACK, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 0;
+ setrlimit(RLIMIT_CORE, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 256;
+ setrlimit(RLIMIT_NOFILE, &rlim);
+}
+
+static void loop();
+
+static int do_sandbox_none(void)
+{
+ sandbox_common();
+ loop();
+ return 0;
+}
+
+struct thread_t {
+ int created, call;
+ event_t ready, done;
+};
+
+static struct thread_t threads[16];
+static void execute_call(int call);
+static int running;
+
+static void* thr(void* arg)
+{
+ struct thread_t* th = (struct thread_t*)arg;
+ for (;;) {
+ event_wait(&th->ready);
+ event_reset(&th->ready);
+ execute_call(th->call);
+ __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED);
+ event_set(&th->done);
+ }
+ return 0;
+}
+
+static void execute_one(void)
+{
+ if (write(1, "executing program\n", sizeof("executing program\n") - 1)) {
+ }
+ int i, call, thread;
+ for (call = 0; call < 3; call++) {
+ for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0]));
+ thread++) {
+ struct thread_t* th = &threads[thread];
+ if (!th->created) {
+ th->created = 1;
+ event_init(&th->ready);
+ event_init(&th->done);
+ event_set(&th->done);
+ thread_start(thr, th);
+ }
+ if (!event_isset(&th->done))
+ continue;
+ event_reset(&th->done);
+ th->call = call;
+ __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED);
+ event_set(&th->ready);
+ event_timedwait(&th->done, 50);
+ break;
+ }
+ }
+ for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++)
+ sleep_ms(1);
+}
+
+static void execute_one(void);
+
+#define WAIT_FLAGS 0
+
+static void loop(void)
+{
+ int iter = 0;
+ for (;; iter++) {
+ char cwdbuf[32];
+ sprintf(cwdbuf, "./%d", iter);
+ if (mkdir(cwdbuf, 0777))
+ exit(1);
+ int pid = fork();
+ if (pid < 0)
+ exit(1);
+ if (pid == 0) {
+ if (chdir(cwdbuf))
+ exit(1);
+ execute_one();
+ exit(0);
+ }
+ int status = 0;
+ uint64_t start = current_time_ms();
+ for (;;) {
+ sleep_ms(10);
+ if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
+ break;
+ if (current_time_ms() - start < 5000)
+ continue;
+ kill_and_wait(pid, &status);
+ break;
+ }
+ remove_dir(cwdbuf);
+ }
+}
+
+uint64_t r[1] = {0xffffffffffffffff};
+
+void execute_call(int call)
+{
+ intptr_t res = 0;
+ switch (call) {
+ case 0:
+ // socket arguments: [
+ // domain: socket_domain = 0x26 (8 bytes)
+ // type: socket_type = 0x2 (8 bytes)
+ // proto: int8 = 0x0 (1 bytes)
+ // ]
+ // returns sock
+ res = syscall(SYS_socket, /*domain=AF_INET|0x24*/ 0x26ul,
+ /*type=SOCK_DGRAM*/ 2ul, /*proto=*/0);
+ if (res != -1)
+ r[0] = res;
+ break;
+ case 1:
+ // bind arguments: [
+ // fd: sock (resource)
+ // addr: ptr[in, sockaddr_storage] {
+ // union sockaddr_storage {
+ // in6: sockaddr_in6 {
+ // len: len = 0x22 (1 bytes)
+ // family: const = 0x1c (1 bytes)
+ // port: proc = 0x3 (2 bytes)
+ // flow: int32 = 0x0 (4 bytes)
+ // addr: union ipv6_addr {
+ // mcast1: ipv6_addr_multicast1 {
+ // a0: const = 0xff (1 bytes)
+ // a1: const = 0x1 (1 bytes)
+ // a2: buffer: {00 00 00 00 00 00 00 00 00 00 00 00 00} (length
+ // 0xd) a3: const = 0x1 (1 bytes)
+ // }
+ // }
+ // scope: int32 = 0x0 (4 bytes)
+ // }
+ // }
+ // }
+ // addrlen: len = 0xc (8 bytes)
+ // ]
+ NONFAILING(*(uint8_t*)0x200000000040 = 0x22);
+ NONFAILING(*(uint8_t*)0x200000000041 = 0x1c);
+ NONFAILING(*(uint16_t*)0x200000000042 = htobe16(0x4e23 + procid * 4));
+ NONFAILING(*(uint32_t*)0x200000000044 = 0);
+ NONFAILING(*(uint8_t*)0x200000000048 = -1);
+ NONFAILING(*(uint8_t*)0x200000000049 = 1);
+ NONFAILING(memset((void*)0x20000000004a, 0, 13));
+ NONFAILING(*(uint8_t*)0x200000000057 = 1);
+ NONFAILING(*(uint32_t*)0x200000000058 = 0);
+ syscall(SYS_bind, /*fd=*/r[0], /*addr=*/0x200000000040ul,
+ /*addrlen=*/0xcul);
+ break;
+ case 2:
+ // recvfrom\$inet arguments: [
+ // fd: sock_in (resource)
+ // buf: nil
+ // len: len = 0x51 (8 bytes)
+ // f: recv_flags = 0x401313ab1a02f21f (8 bytes)
+ // addr: nil
+ // addrlen: len = 0x0 (8 bytes)
+ // ]
+ syscall(SYS_recvfrom, /*fd=*/r[0], /*buf=*/0ul, /*len=*/0x51ul,
+ /*f=MSG_PEEK|MSG_OOB|0x401313ab1a02f21c*/ 0x401313ab1a02f21ful,
+ /*addr=*/0ul, /*addrlen=*/0ul);
+ break;
+ }
+}
+int main(void)
+{
+ syscall(SYS_mmap, /*addr=*/0x200000000000ul, /*len=*/0x1000000ul,
+ /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul,
+ /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x1012ul,
+ /*fd=*/(intptr_t)-1, /*offset=*/0ul);
+ const char* reason;
+ (void)reason;
+ install_segv_handler();
+ for (procid = 0; procid < 4; procid++) {
+ if (fork() == 0) {
+ use_temporary_dir();
+ do_sandbox_none();
+ }
+ }
+ sleep(1000000);
+ return 0;
+}
+EOF
+mycc -o /tmp/$prog -Wall -Wextra -O0 /tmp/$prog.c -pthread || exit 1
+
+(cd ../testcases/swap; ./swap -t 5m -i 20 -l 100 > /dev/null 2>&1) &
+sleep 5
+
+work=/tmp/$prog.dir
+rm -rf $work
+mkdir $work
+cd /tmp/$prog.dir
+
+timeout 5m /tmp/$prog > /dev/null 2>&1
+
+while pkill swap; do :; done
+wait
+
+rm -rf /tmp/$prog /tmp/$prog.c /tmp/$prog.core /tmp/syzkaller.?????? $work
+exit 0
diff --git a/tools/test/stress2/misc/syzkaller86.sh b/tools/test/stress2/misc/syzkaller86.sh
new file mode 100755
index 000000000000..12922a2d05fa
--- /dev/null
+++ b/tools/test/stress2/misc/syzkaller86.sh
@@ -0,0 +1,555 @@
+#!/bin/sh
+
+# Fatal trap 12: page fault while in kernel mode
+# cpuid = 1; apic id = 01
+# fault virtual address = 0x18
+# fault code = supervisor read data, page not present
+# instruction pointer = 0x20:0xffffffff80b69835
+# stack pointer = 0x28:0xfffffe00ff8e7d90
+# frame pointer = 0x28:0xfffffe00ff8e7d90
+# code segment = base 0x0, limit 0xfffff, type 0x1b
+# = DPL 0, pres 1, long 1, def32 0, gran 1
+# processor eflags = interrupt enabled, resume, IOPL = 0
+# current process = 0 (thread taskq)
+# rdi: 0000000000000018 rsi: 0000000000000004 rdx: ffffffff812b3f65
+# rcx: 00000000000008ba r8: fffff800044b8780 r9: fffff80003397000
+# rax: 0000000000000001 rbx: fffff8004221fa00 rbp: fffffe00ff8e7d90
+# r10: 0000000000000001 r11: fffffe00dc47b000 r12: fffffe0177ed0000
+# r13: fffff800044b8780 r14: fffff8004221f800 r15: fffff8004221f800
+# trap number = 12
+# panic: page fault
+# cpuid = 1
+# time = 1759322830
+# KDB: stack backtrace:
+# db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe00ff8e7ac0
+# vpanic() at vpanic+0x136/frame 0xfffffe00ff8e7bf0
+# panic() at panic+0x43/frame 0xfffffe00ff8e7c50
+# trap_pfault() at trap_pfault+0x47c/frame 0xfffffe00ff8e7cc0
+# calltrap() at calltrap+0x8/frame 0xfffffe00ff8e7cc0
+# --- trap 0xc, rip = 0xffffffff80b69835, rsp = 0xfffffe00ff8e7d90, rbp = 0xfffffe00ff8e7d90 ---
+# __mtx_assert() at __mtx_assert+0x35/frame 0xfffffe00ff8e7d90
+# ktls_check_rx() at ktls_check_rx+0x2f/frame 0xfffffe00ff8e7dd0
+# socantrcvmore() at socantrcvmore+0x5e/frame 0xfffffe00ff8e7df0
+# unp_gc() at unp_gc+0x5df/frame 0xfffffe00ff8e7e40
+# taskqueue_run_locked() at taskqueue_run_locked+0x1c2/frame 0xfffffe00ff8e7ec0
+# taskqueue_thread_loop() at taskqueue_thread_loop+0xd3/frame 0xfffffe00ff8e7ef0
+# fork_exit() at fork_exit+0x82/frame 0xfffffe00ff8e7f30
+# fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe00ff8e7f30
+# --- trap 0, rip = 0, rsp = 0, rbp = 0 ---
+# KDB: enter: panic
+# [ thread pid 0 tid 100045 ]
+# Stopped at kdb_enter+0x33: movq $0,0x121a9e2(%rip)
+# db> x/s version
+# version: FreeBSD 16.0-CURRENT #0 vmfqe-n280784-b7f165e45d6d: Wed Oct 1 13:48:43 CEST 2025
+# pho@mercat1.netperf.freebsd.org:/var/tmp/deviant3/sys/amd64/compile/PHO
+# db>
+
+[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
+
+. ../default.cfg
+set -u
+prog=$(basename "$0" .sh)
+cat > /tmp/$prog.c <<EOF
+// https://syzkaller.appspot.com/bug?id=ec40fe3e3e2b41218d1d417bc10d0be2517bf751
+// autogenerated by syzkaller (https://github.com/google/syzkaller)
+// syzbot+a62883292a5c257703be@syzkaller.appspotmail.com
+
+#define _GNU_SOURCE
+
+#include <sys/types.h>
+
+#include <dirent.h>
+#include <errno.h>
+#include <pthread.h>
+#include <pwd.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/endian.h>
+#include <sys/resource.h>
+#include <sys/stat.h>
+#include <sys/syscall.h>
+#include <sys/wait.h>
+#include <time.h>
+#include <unistd.h>
+
+static unsigned long long procid;
+
+static void kill_and_wait(int pid, int* status)
+{
+ kill(pid, SIGKILL);
+ while (waitpid(-1, status, 0) != pid) {
+ }
+}
+
+static void sleep_ms(uint64_t ms)
+{
+ usleep(ms * 1000);
+}
+
+static uint64_t current_time_ms(void)
+{
+ struct timespec ts;
+ if (clock_gettime(CLOCK_MONOTONIC, &ts))
+ exit(1);
+ return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
+}
+
+static void use_temporary_dir(void)
+{
+ char tmpdir_template[] = "./syzkaller.XXXXXX";
+ char* tmpdir = mkdtemp(tmpdir_template);
+ if (!tmpdir)
+ exit(1);
+ if (chmod(tmpdir, 0777))
+ exit(1);
+ if (chdir(tmpdir))
+ exit(1);
+}
+
+static void reset_flags(const char* filename)
+{
+ struct stat st;
+ if (lstat(filename, &st))
+ exit(1);
+ st.st_flags &= ~(SF_NOUNLINK | UF_NOUNLINK | SF_IMMUTABLE | UF_IMMUTABLE |
+ SF_APPEND | UF_APPEND);
+ if (lchflags(filename, st.st_flags))
+ exit(1);
+}
+static void __attribute__((noinline)) remove_dir(const char* dir)
+{
+ DIR* dp = opendir(dir);
+ if (dp == NULL) {
+ if (errno == EACCES) {
+ if (rmdir(dir))
+ exit(1);
+ return;
+ }
+ exit(1);
+ }
+ struct dirent* ep = 0;
+ while ((ep = readdir(dp))) {
+ if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0)
+ continue;
+ char filename[FILENAME_MAX];
+ snprintf(filename, sizeof(filename), "%s/%s", dir, ep->d_name);
+ struct stat st;
+ if (lstat(filename, &st))
+ exit(1);
+ if (S_ISDIR(st.st_mode)) {
+ remove_dir(filename);
+ continue;
+ }
+ if (unlink(filename)) {
+ if (errno == EPERM) {
+ reset_flags(filename);
+ reset_flags(dir);
+ if (unlink(filename) == 0)
+ continue;
+ }
+ exit(1);
+ }
+ }
+ closedir(dp);
+ while (rmdir(dir)) {
+ if (errno == EPERM) {
+ reset_flags(dir);
+ if (rmdir(dir) == 0)
+ break;
+ }
+ exit(1);
+ }
+}
+
+static void thread_start(void* (*fn)(void*), void* arg)
+{
+ pthread_t th;
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setstacksize(&attr, 128 << 10);
+ int i = 0;
+ for (; i < 100; i++) {
+ if (pthread_create(&th, &attr, fn, arg) == 0) {
+ pthread_attr_destroy(&attr);
+ return;
+ }
+ if (errno == EAGAIN) {
+ usleep(50);
+ continue;
+ }
+ break;
+ }
+ exit(1);
+}
+
+typedef struct {
+ pthread_mutex_t mu;
+ pthread_cond_t cv;
+ int state;
+} event_t;
+
+static void event_init(event_t* ev)
+{
+ if (pthread_mutex_init(&ev->mu, 0))
+ exit(1);
+ if (pthread_cond_init(&ev->cv, 0))
+ exit(1);
+ ev->state = 0;
+}
+
+static void event_reset(event_t* ev)
+{
+ ev->state = 0;
+}
+
+static void event_set(event_t* ev)
+{
+ pthread_mutex_lock(&ev->mu);
+ if (ev->state)
+ exit(1);
+ ev->state = 1;
+ pthread_mutex_unlock(&ev->mu);
+ pthread_cond_broadcast(&ev->cv);
+}
+
+static void event_wait(event_t* ev)
+{
+ pthread_mutex_lock(&ev->mu);
+ while (!ev->state)
+ pthread_cond_wait(&ev->cv, &ev->mu);
+ pthread_mutex_unlock(&ev->mu);
+}
+
+static int event_isset(event_t* ev)
+{
+ pthread_mutex_lock(&ev->mu);
+ int res = ev->state;
+ pthread_mutex_unlock(&ev->mu);
+ return res;
+}
+
+static int event_timedwait(event_t* ev, uint64_t timeout)
+{
+ uint64_t start = current_time_ms();
+ uint64_t now = start;
+ pthread_mutex_lock(&ev->mu);
+ for (;;) {
+ if (ev->state)
+ break;
+ uint64_t remain = timeout - (now - start);
+ struct timespec ts;
+ ts.tv_sec = remain / 1000;
+ ts.tv_nsec = (remain % 1000) * 1000 * 1000;
+ pthread_cond_timedwait(&ev->cv, &ev->mu, &ts);
+ now = current_time_ms();
+ if (now - start > timeout)
+ break;
+ }
+ int res = ev->state;
+ pthread_mutex_unlock(&ev->mu);
+ return res;
+}
+
+static void sandbox_common()
+{
+ struct rlimit rlim;
+ rlim.rlim_cur = rlim.rlim_max = 128 << 20;
+ setrlimit(RLIMIT_AS, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 8 << 20;
+ setrlimit(RLIMIT_MEMLOCK, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 1 << 20;
+ setrlimit(RLIMIT_FSIZE, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 1 << 20;
+ setrlimit(RLIMIT_STACK, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 0;
+ setrlimit(RLIMIT_CORE, &rlim);
+ rlim.rlim_cur = rlim.rlim_max = 256;
+ setrlimit(RLIMIT_NOFILE, &rlim);
+}
+
+static void loop();
+
+static int do_sandbox_none(void)
+{
+ sandbox_common();
+ loop();
+ return 0;
+}
+
+struct thread_t {
+ int created, call;
+ event_t ready, done;
+};
+
+static struct thread_t threads[16];
+static void execute_call(int call);
+static int running;
+
+static void* thr(void* arg)
+{
+ struct thread_t* th = (struct thread_t*)arg;
+ for (;;) {
+ event_wait(&th->ready);
+ event_reset(&th->ready);
+ execute_call(th->call);
+ __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED);
+ event_set(&th->done);
+ }
+ return 0;
+}
+
+static void execute_one(void)
+{
+ if (write(1, "executing program\n", sizeof("executing program\n") - 1)) {
+ }
+ int i, call, thread;
+ for (call = 0; call < 8; call++) {
+ for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0]));
+ thread++) {
+ struct thread_t* th = &threads[thread];
+ if (!th->created) {
+ th->created = 1;
+ event_init(&th->ready);
+ event_init(&th->done);
+ event_set(&th->done);
+ thread_start(thr, th);
+ }
+ if (!event_isset(&th->done))
+ continue;
+ event_reset(&th->done);
+ th->call = call;
+ __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED);
+ event_set(&th->ready);
+ event_timedwait(&th->done, 50);
+ break;
+ }
+ }
+ for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++)
+ sleep_ms(1);
+}
+
+static void execute_one(void);
+
+#define WAIT_FLAGS 0
+
+static void loop(void)
+{
+ int iter = 0;
+ for (;; iter++) {
+ char cwdbuf[32];
+ sprintf(cwdbuf, "./%d", iter);
+ if (mkdir(cwdbuf, 0777))
+ exit(1);
+ int pid = fork();
+ if (pid < 0)
+ exit(1);
+ if (pid == 0) {
+ if (chdir(cwdbuf))
+ exit(1);
+ execute_one();
+ exit(0);
+ }
+ int status = 0;
+ uint64_t start = current_time_ms();
+ for (;;) {
+ sleep_ms(10);
+ if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
+ break;
+ if (current_time_ms() - start < 5000)
+ continue;
+ kill_and_wait(pid, &status);
+ break;
+ }
+ remove_dir(cwdbuf);
+ }
+}
+
+uint64_t r[3] = {0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff};
+
+void execute_call(int call)
+{
+ intptr_t res = 0;
+ switch (call) {
+ case 0:
+ // freebsd10_pipe arguments: [
+ // pipefd: ptr[out, pipefd] {
+ // pipefd {
+ // rfd: fd (resource)
+ // wfd: fd (resource)
+ // }
+ // }
+ // ]
+ res = syscall(SYS_freebsd10_pipe, /*pipefd=*/0x2000000001c0ul);
+ if (res != -1)
+ r[0] = *(uint32_t*)0x2000000001c4;
+ break;
+ case 1:
+ // close arguments: [
+ // fd: fd (resource)
+ // ]
+ syscall(SYS_close, /*fd=*/r[0]);
+ break;
+ case 2:
+ // socket\$unix arguments: [
+ // domain: const = 0x1 (8 bytes)
+ // type: unix_socket_type = 0x5 (8 bytes)
+ // proto: const = 0x0 (1 bytes)
+ // ]
+ // returns sock_unix
+ res = syscall(SYS_socket, /*domain=*/1ul, /*type=SOCK_SEQPACKET*/ 5ul,
+ /*proto=*/0);
+ if (res != -1)
+ r[1] = res;
+ break;
+ case 3:
+ // bind\$unix arguments: [
+ // fd: sock_unix (resource)
+ // addr: ptr[in, sockaddr_un] {
+ // union sockaddr_un {
+ // file: sockaddr_un_file {
+ // len: len = 0xa (1 bytes)
+ // family: unix_socket_family = 0x1 (1 bytes)
+ // path: buffer: {2e 2f 66 69 6c 65 31 00} (length 0x8)
+ // }
+ // }
+ // }
+ // addrlen: len = 0xa (8 bytes)
+ // ]
+ *(uint8_t*)0x2000000002c0 = 0xa;
+ *(uint8_t*)0x2000000002c1 = 1;
+ memcpy((void*)0x2000000002c2, "./file1\000", 8);
+ syscall(SYS_bind, /*fd=*/r[1], /*addr=*/0x2000000002c0ul,
+ /*addrlen=*/0xaul);
+ break;
+ case 4:
+ // listen arguments: [
+ // fd: sock (resource)
+ // backlog: int32 = 0xfffffffe (4 bytes)
+ // ]
+ syscall(SYS_listen, /*fd=*/r[1], /*backlog=*/0xfffffffe);
+ break;
+ case 5:
+ // sendmsg\$unix arguments: [
+ // fd: sock_unix (resource)
+ // msg: ptr[in, msghdr_un] {
+ // msghdr_un {
+ // addr: nil
+ // addrlen: len = 0x0 (4 bytes)
+ // pad = 0x0 (4 bytes)
+ // vec: nil
+ // vlen: len = 0x0 (8 bytes)
+ // ctrl: ptr[inout, array[ANYUNION]] {
+ // array[ANYUNION] {
+ // union ANYUNION {
+ // ANYBLOB: buffer: {89 00 00 00 ff ff 00 00 01} (length 0x9)
+ // }
+ // }
+ // }
+ // ctrllen: bytesize = 0x9 (8 bytes)
+ // f: send_flags = 0x0 (4 bytes)
+ // pad = 0x0 (4 bytes)
+ // }
+ // }
+ // f: send_flags = 0x0 (8 bytes)
+ // ]
+ *(uint64_t*)0x200000000080 = 0;
+ *(uint32_t*)0x200000000088 = 0;
+ *(uint64_t*)0x200000000090 = 0;
+ *(uint64_t*)0x200000000098 = 0;
+ *(uint64_t*)0x2000000000a0 = 0x200000000000;
+ memcpy((void*)0x200000000000, "\x89\x00\x00\x00\xff\xff\x00\x00\x01", 9);
+ *(uint64_t*)0x2000000000a8 = 9;
+ *(uint32_t*)0x2000000000b0 = 0;
+ syscall(SYS_sendmsg, /*fd=*/(intptr_t)-1, /*msg=*/0x200000000080ul,
+ /*f=*/0ul);
+ break;
+ case 6:
+ // socketpair\$unix arguments: [
+ // domain: const = 0x1 (8 bytes)
+ // type: unix_socket_type = 0x2 (8 bytes)
+ // proto: const = 0x0 (1 bytes)
+ // fds: ptr[out, unix_pair] {
+ // unix_pair {
+ // fd0: sock_unix (resource)
+ // fd1: sock_unix (resource)
+ // }
+ // }
+ // ]
+ res = syscall(SYS_socketpair, /*domain=*/1ul, /*type=SOCK_DGRAM*/ 2ul,
+ /*proto=*/0, /*fds=*/0x200000000040ul);
+ if (res != -1)
+ r[2] = *(uint32_t*)0x200000000040;
+ break;
+ case 7:
+ // sendmsg arguments: [
+ // fd: sock (resource)
+ // msg: ptr[in, send_msghdr] {
+ // send_msghdr {
+ // msg_name: nil
+ // msg_namelen: len = 0x32c (4 bytes)
+ // pad = 0x0 (4 bytes)
+ // msg_iov: nil
+ // msg_iovlen: len = 0x0 (8 bytes)
+ // msg_control: ptr[in, array[cmsghdr]] {
+ // array[cmsghdr] {
+ // }
+ // }
+ // msg_controllen: bytesize = 0x90 (8 bytes)
+ // msg_flags: const = 0x0 (4 bytes)
+ // pad = 0x0 (4 bytes)
+ // }
+ // }
+ // f: send_flags = 0x0 (8 bytes)
+ // ]
+ *(uint64_t*)0x200000000380 = 0;
+ *(uint32_t*)0x200000000388 = 0x32c;
+ *(uint64_t*)0x200000000390 = 0;
+ *(uint64_t*)0x200000000398 = 0;
+ *(uint64_t*)0x2000000003a0 = 0x200000000000;
+ *(uint64_t*)0x2000000003a8 = 0x90;
+ *(uint32_t*)0x2000000003b0 = 0;
+ syscall(SYS_sendmsg, /*fd=*/r[2], /*msg=*/0x200000000380ul, /*f=*/0ul);
+ break;
+ }
+}
+int main(void)
+{
+ syscall(SYS_mmap, /*addr=*/0x200000000000ul, /*len=*/0x1000000ul,
+ /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul,
+ /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x1012ul,
+ /*fd=*/(intptr_t)-1, /*offset=*/0ul);
+ const char* reason;
+ (void)reason;
+ for (procid = 0; procid < 4; procid++) {
+ if (fork() == 0) {
+ use_temporary_dir();
+ do_sandbox_none();
+ }
+ }
+ sleep(1000000);
+ return 0;
+}
+EOF
+mycc -o /tmp/$prog -Wall -Wextra -O0 /tmp/$prog.c -pthread || exit 1
+
+work=/tmp/$prog.dir
+rm -rf $work
+mkdir $work
+cd /tmp/$prog.dir
+for i in `jot 30`; do
+ (
+ mkdir d$i
+ cd d$i
+ timeout 3m /tmp/$prog > /dev/null 2>&1 &
+ )
+done
+while pgrep -q $prog; do sleep 2; done
+wait
+
+rm -rf /tmp/$prog /tmp/$prog.c /tmp/$prog.core $work
+exit 0
diff --git a/usr.sbin/bsdinstall/bsdinstall.8 b/usr.sbin/bsdinstall/bsdinstall.8
index 527250d380d1..6175d26b4fd3 100644
--- a/usr.sbin/bsdinstall/bsdinstall.8
+++ b/usr.sbin/bsdinstall/bsdinstall.8
@@ -1,4 +1,6 @@
-.\"-
+.\"
+.\" SPDX-License-Identifier: BSD-2-Clause
+.\"
.\" Copyright (c) 2011-2013 Nathan Whitehorn <nwhitehorn@FreeBSD.org> All rights reserved.
.\" Copyright (c) 2018 Roberto Fernandez Cueto <roberfern@gmail.com>
.\" Copyright (c) 2024 The FreeBSD Foundation
@@ -27,7 +29,7 @@
.\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd November 4, 2024
+.Dd October 3, 2025
.Dt BSDINSTALL 8
.Os
.Sh NAME
@@ -40,9 +42,10 @@
.Op Ar ...
.Sh DESCRIPTION
.Nm
-is used for installation of new systems, both for system setup from
-installation media, e.g., CD-ROMs, and for use on live systems to prepare
-VM images and jails.
+is used for installation of new systems,
+both for system setup from installation media,
+such as discs, USBs, or network boot environments,
+and for use on live systems to prepare jails and virtual machine images.
.Pp
Much like
.Xr make 1 , Nm
@@ -56,7 +59,7 @@ these subtargets can be invoked separately by an installation script.
.Sh OPTIONS
.Nm
supports the following options, global to all targets:
-.Bl -tag -width indent+
+.Bl -tag -width "-D file"
.It Fl D Ar file
Provide a path for the installation log file
.Pq overrides Ev BSDINSTALL_LOG .
@@ -73,7 +76,7 @@ For interactive use, most users will be interested only in the
and
.Cm script
targets.
-.Bl -tag -width "jail destination"
+.Bl -tag -width "-D file"
.It Cm auto
Run the standard interactive installation, including disk partitioning.
.It Cm jail Ar destination
@@ -295,7 +298,7 @@ Many are used internally during installation and have reasonable default values
for most installation scenarios.
Others are set by various interactive user prompts, and can be usefully
overridden when making scripted or customized installers.
-.Bl -tag -width "BSDINSTALL_DISTSITE"
+.Bl -tag -width "-D file"
.It Ev TMPDIR
The directory to use for temporary files.
Default: