From 2ddb767253fbc81e1c315af2aa3da0586002bc7f Mon Sep 17 00:00:00 2001 From: "Randall S. Becker" Date: Tue, 28 Oct 2025 19:11:26 +0000 Subject: [PATCH] Rollup fixes for NonStop builds. This change includes bss_sock.c to deal with introduction of EPROTO use. Reroll of rsa_ossl.c changes made at 3.5 downward. Build a workaround in timing_load_creds.c on NonStop for lack of rusage. This simulates getrusage() that is not available on NonStop. Update bioprinttest.c to handle missing PTRxPRT definitions from inttypes.h. Fixes: #29023 Signed-off-by: Randall S. Becker Reviewed-by: Richard Levitte Reviewed-by: Neil Horman Reviewed-by: Dmitry Belyavskiy (Merged from https://github.com/openssl/openssl/pull/29024) --- crypto/bio/bss_sock.c | 2 +- crypto/rsa/rsa_ossl.c | 28 +++++++++++++++++++++++-- include/internal/threads_common.h | 1 + test/bioprinttest.c | 18 ++++++++++++++++ test/timing_load_creds.c | 35 +++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 3 deletions(-) diff --git a/crypto/bio/bss_sock.c b/crypto/bio/bss_sock.c index 11a83940813..0d8d132d6e7 100644 --- a/crypto/bio/bss_sock.c +++ b/crypto/bio/bss_sock.c @@ -309,7 +309,7 @@ int BIO_sock_non_fatal_error(int err) || err == EAGAIN || err == ENOTCONN || err == EINTR -# if ! defined (__DJGPP__) +# if !defined(__DJGPP__) && !defined(OPENSSL_SYS_TANDEM) || err == EPROTO # endif || err == EINPROGRESS diff --git a/crypto/rsa/rsa_ossl.c b/crypto/rsa/rsa_ossl.c index 1e56c6d38c6..90ad0f53fa8 100644 --- a/crypto/rsa/rsa_ossl.c +++ b/crypto/rsa/rsa_ossl.c @@ -18,6 +18,10 @@ #include "crypto/sparse_array.h" #include "rsa_local.h" #include "internal/constant_time.h" +#if defined(OPENSSL_SYS_TANDEM) +# include "internal/tsan_assist.h" +# include "internal/threads_common.h" +#endif #include #include #include @@ -210,6 +214,26 @@ static int rsa_ossl_public_encrypt(int flen, const unsigned char *from, return r; } +#if defined(OPENSSL_SYS_TANDEM) +static TSAN_QUALIFIER uint64_t tsan_thread_id = 1; +#endif + +static uintptr_t get_unique_thread_id(void) +{ +#if defined(OPENSSL_SYS_TANDEM) + uintptr_t thread_id = (uintptr_t)CRYPTO_THREAD_get_local_ex(CRYPTO_THREAD_LOCAL_TANDEM_ID_KEY, + NULL); + + if (thread_id == 0) { + thread_id = tsan_counter(&tsan_thread_id); + CRYPTO_THREAD_set_local_ex(CRYPTO_THREAD_LOCAL_TANDEM_ID_KEY, NULL, (void *)thread_id); + } + return thread_id; +#else + return (uintptr_t)CRYPTO_THREAD_get_current_id(); +#endif +} + static void free_bn_blinding(ossl_uintmax_t idx, BN_BLINDING *b, void *arg) { BN_BLINDING_free(b); @@ -231,7 +255,7 @@ void *ossl_rsa_alloc_blinding(void) static BN_BLINDING *ossl_rsa_get_thread_bn_blinding(RSA *rsa) { SPARSE_ARRAY_OF(BN_BLINDING) *blindings = rsa->blindings_sa; - uintptr_t tid = (uintptr_t)CRYPTO_THREAD_get_current_id(); + uintptr_t tid = get_unique_thread_id(); return ossl_sa_BN_BLINDING_get(blindings, tid); } @@ -239,7 +263,7 @@ static BN_BLINDING *ossl_rsa_get_thread_bn_blinding(RSA *rsa) static int ossl_rsa_set_thread_bn_blinding(RSA *rsa, BN_BLINDING *b) { SPARSE_ARRAY_OF(BN_BLINDING) *blindings = rsa->blindings_sa; - uintptr_t tid = (uintptr_t)CRYPTO_THREAD_get_current_id(); + uintptr_t tid = get_unique_thread_id(); return ossl_sa_BN_BLINDING_set(blindings, tid, b); } diff --git a/include/internal/threads_common.h b/include/internal/threads_common.h index aa5f1b08acc..a43c42d3f5c 100644 --- a/include/internal/threads_common.h +++ b/include/internal/threads_common.h @@ -18,6 +18,7 @@ typedef enum { CRYPTO_THREAD_LOCAL_ASYNC_CTX_KEY, CRYPTO_THREAD_LOCAL_ASYNC_POOL_KEY, CRYPTO_THREAD_LOCAL_TEVENT_KEY, + CRYPTO_THREAD_LOCAL_TANDEM_ID_KEY, CRYPTO_THREAD_LOCAL_FIPS_DEFERRED_KEY, CRYPTO_THREAD_LOCAL_KEY_MAX } CRYPTO_THREAD_LOCAL_KEY_ID; diff --git a/test/bioprinttest.c b/test/bioprinttest.c index d670c2a6737..6e06c3c42f2 100644 --- a/test/bioprinttest.c +++ b/test/bioprinttest.c @@ -10,6 +10,24 @@ #define TESTUTIL_NO_size_t_COMPARISON #include +#if defined(__TANDEM) && defined(__H_Series_RVU) +/* Restrict this block to NonStop J-series (Itanium) only. */ +# if defined(__LP64) +# define PRIdPTR "lld" +# define PRIiPTR "lli" +# define PRIoPTR "llo" +# define PRIuPTR "llu" +# define PRIxPTR "llx" +# define PRIXPTR "llX" +# else +# define PRIdPTR "d" +# define PRIiPTR "i" +# define PRIoPTR "o" +# define PRIuPTR "u" +# define PRIxPTR "x" +# define PRIXPTR "X" +# endif +#endif #include #include #include diff --git a/test/timing_load_creds.c b/test/timing_load_creds.c index 80837989b77..1838f0d5094 100644 --- a/test/timing_load_creds.c +++ b/test/timing_load_creds.c @@ -94,6 +94,9 @@ static void usage(void) # endif #endif +#if !defined(RUSAGE_SELF) && defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L +# include +#endif int main(int ac, char **av) { #if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L @@ -101,7 +104,13 @@ int main(int ac, char **av) struct stat sb; FILE *fp; char *contents; +# if !defined(RUSAGE_SELF) + struct tms rus; + struct timeval u_start, u_end, u_elapsed; + struct timeval s_start, s_end, s_elapsed; +# else struct rusage start, end, elapsed; +# endif struct timeval e_start, e_end, e_elapsed; /* Parse JCL. */ @@ -177,11 +186,19 @@ int main(int ac, char **av) perror("elapsed start"); exit(EXIT_FAILURE); } +# if !defined(RUSAGE_SELF) + times(&rus); + u_start.tv_sec = rus.tms_utime / CLOCKS_PER_SEC; + u_start.tv_usec = (rus.tms_utime * 1000000) / CLOCKS_PER_SEC; + s_start.tv_sec = rus.tms_stime / CLOCKS_PER_SEC; + s_start.tv_usec = (rus.tms_stime * 1000000) / CLOCKS_PER_SEC; +# else if (getrusage(RUSAGE_SELF, &start) < 0) { OPENSSL_free(contents); perror("start"); exit(EXIT_FAILURE); } +# endif for (i = count; i > 0; i--) { switch (what) { case 'c': @@ -192,22 +209,40 @@ int main(int ac, char **av) break; } } +# if !defined(RUSAGE_SELF) + times(&rus); + u_end.tv_sec = rus.tms_utime / CLOCKS_PER_SEC; + u_end.tv_usec = (rus.tms_utime * 1000000) / CLOCKS_PER_SEC; + s_end.tv_sec = rus.tms_stime / CLOCKS_PER_SEC; + s_end.tv_usec = (rus.tms_stime * 1000000) / CLOCKS_PER_SEC; +# else if (getrusage(RUSAGE_SELF, &end) < 0) { OPENSSL_free(contents); perror("getrusage"); exit(EXIT_FAILURE); } +# endif if (gettimeofday(&e_end, NULL) < 0) { OPENSSL_free(contents); perror("gettimeofday"); exit(EXIT_FAILURE); } +# if !defined(RUSAGE_SELF) + timersub(&u_end, &u_start, &u_elapsed); + timersub(&s_end, &s_start, &s_elapsed); +# else timersub(&end.ru_utime, &start.ru_stime, &elapsed.ru_stime); timersub(&end.ru_utime, &start.ru_utime, &elapsed.ru_utime); +# endif timersub(&e_end, &e_start, &e_elapsed); +# if !defined(RUSAGE_SELF) + print_timeval("user ", &u_elapsed); + print_timeval("sys ", &s_elapsed); +# else print_timeval("user ", &elapsed.ru_utime); print_timeval("sys ", &elapsed.ru_stime); +# endif if (debug) print_timeval("elapsed??", &e_elapsed); -- 2.47.3