]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Rollup fixes for NonStop builds.
authorRandall S. Becker <randall.becker@nexbridge.ca>
Tue, 28 Oct 2025 19:11:26 +0000 (19:11 +0000)
committerNeil Horman <nhorman@openssl.org>
Wed, 5 Nov 2025 21:08:06 +0000 (16:08 -0500)
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 <randall.becker@nexbridge.ca>
Reviewed-by: Richard Levitte <levitte@openssl.org>
Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
(Merged from https://github.com/openssl/openssl/pull/29024)

crypto/bio/bss_sock.c
crypto/rsa/rsa_ossl.c
include/internal/threads_common.h
test/bioprinttest.c
test/timing_load_creds.c

index 11a8394081353f67d7c14fe26d873a62ac6a5f7e..0d8d132d6e7745ac9429cd7fc3f06590283e06e9 100644 (file)
@@ -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
index 1e56c6d38c61feec34a8d40bff8457cabe728043..90ad0f53fa81ef0b7ed84d4d5649809617e94727 100644 (file)
 #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 <openssl/evp.h>
 #include <openssl/sha.h>
 #include <openssl/hmac.h>
@@ -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);
 }
index aa5f1b08acc726792835228a022d030ed66a76f8..a43c42d3f5c69246b638b9954e18322737335134 100644 (file)
@@ -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;
index d670c2a673741b568c3e2684832c4be07b58717c..6e06c3c42f270c1f23a8224577241785764144d3 100644 (file)
 #define TESTUTIL_NO_size_t_COMPARISON
 
 #include <inttypes.h>
+#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 <stdbool.h>
 #include <stdio.h>
 #include <string.h>
index 80837989b77304bcd625dbda86d06503e1e0d96f..1838f0d50946bffa064a4db708ad2ca2a613de8d 100644 (file)
@@ -94,6 +94,9 @@ static void usage(void)
 # endif
 #endif
 
+#if !defined(RUSAGE_SELF) && defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L
+# include <sys/times.h>
+#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);