]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Rename ossl_sleep() to OSSL_sleep() and make it public
authorRichard Levitte <levitte@openssl.org>
Mon, 3 Oct 2022 05:10:34 +0000 (07:10 +0200)
committerRichard Levitte <levitte@openssl.org>
Thu, 6 Oct 2022 06:01:09 +0000 (08:01 +0200)
ossl_sleep() was implemented as a static inline function in internal/e_os.h,
using usleep() on Unix and Sleep() on Windows.  So far well and good.
However, it also has a fallback implementation for systems that do not have
usleep() or Sleep(), and that implementation happens to use ossl_time_now(),
which is a normal function, private to libcrypto, and is judged to be too
complex to sanely make into a static inline function.

This fallback creates a problem, because we do use ossl_sleep() in apps/ and
a few test programs in test/, and when they are linked with libcrypto in
shared library form, ossl_time_now() can't be found, since it's not publicly
exposed.

Something needs to give, and the easiest, and hopefully sanest answer is to
make ossl_sleep() a publicly exposed function, which requires a slight name
change.

Documentation and 'make update' result included.

Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
(Merged from https://github.com/openssl/openssl/pull/19330)

crypto/build.info
crypto/sleep.c [new file with mode: 0644]
doc/build.info
doc/man3/OSSL_sleep.pod [new file with mode: 0644]
include/internal/e_os.h
include/openssl/crypto.h.in
util/libcrypto.num

index 1c9ca3a80998ffc6e96dc4aa639a4215df7eff26..24985f443c2f69b4929d0b5d7e176c74ccb60f4b 100644 (file)
@@ -107,7 +107,7 @@ SOURCE[../libcrypto]=$UTIL_COMMON \
         mem.c mem_sec.c \
         cversion.c info.c cpt_err.c ebcdic.c uid.c o_time.c o_dir.c \
         o_fopen.c getenv.c o_init.c init.c trace.c provider.c provider_child.c \
-        punycode.c passphrase.c
+        punycode.c passphrase.c sleep.c
 SOURCE[../providers/libfips.a]=$UTIL_COMMON
 
 SOURCE[../libcrypto]=$UPLINKSRC
diff --git a/crypto/sleep.c b/crypto/sleep.c
new file mode 100644 (file)
index 0000000..1554d93
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2022 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 <openssl/crypto.h>
+#include "internal/e_os.h"
+
+/* system-specific variants defining OSSL_sleep() */
+#if defined(OPENSSL_SYS_UNIX) || defined(__DJGPP__)
+
+void OSSL_sleep(uint64_t millis)
+{
+# ifdef OPENSSL_SYS_VXWORKS
+    struct timespec ts;
+
+    ts.tv_sec = (long int) (millis / 1000);
+    ts.tv_nsec = (long int) (millis % 1000) * 1000000ul;
+    nanosleep(&ts, NULL);
+# elif defined(__TANDEM)
+#  if !defined(_REENTRANT)
+#   include <cextdecs.h(PROCESS_DELAY_)>
+
+    /* HPNS does not support usleep for non threaded apps */
+    PROCESS_DELAY_(millis * 1000);
+#  elif defined(_SPT_MODEL_)
+#   include <spthread.h>
+#   include <spt_extensions.h>
+
+    usleep(millis * 1000);
+#  else
+    usleep(millis * 1000);
+#  endif
+# else
+    usleep(millis * 1000);
+# endif
+}
+#elif defined(_WIN32)
+# include <windows.h>
+
+void OSSL_sleep(uint64_t millis)
+{
+    /*
+     * Windows' Sleep() takes a DWORD argument, which is smaller than
+     * a uint64_t, so we need to split the two to shut the compiler up.
+     */
+    DWORD dword_times;
+    DWORD i;
+
+    dword_times = (DWORD)(millis >> (8 * sizeof(DWORD)));
+    millis &= (DWORD)-1;
+    if (dword_times > 0) {
+        for (i = dword_times; i-- > 0;)
+            Sleep((DWORD)-1);
+        /*
+         * The loop above slept 1 millisec less on each iteration than it
+         * should, this compensates by sleeping as many milliseconds as there
+         * were iterations.  Yes, this is nit picky!
+         */
+        Sleep(dword_times);
+    }
+
+    /* Now, sleep the remaining milliseconds */
+    Sleep((DWORD)(millis));
+}
+#else
+/* Fallback to a busy wait */
+# include "internal/time.h"
+
+static void ossl_sleep_secs(uint64_t secs)
+{
+    /*
+     * sleep() takes an unsigned int argument, which is smaller than
+     * a uint64_t, so it needs to be called in smaller increments.
+     */
+    unsigned int uint_times;
+    unsigned int i;
+
+    uint_times = (unsigned int)(secs >> (8 * sizeof(unsigned int)));
+    if (uint_times > 0) {
+        for (i = uint_times; i-- > 0;)
+            sleep((unsigned int)-1);
+        /*
+         * The loop above slept 1 second less on each iteration than it
+         * should, this compensates by sleeping as many seconds as there were
+         * iterations.  Yes, this is nit picky!
+         */
+        sleep(uint_times);
+    }
+}
+
+static void ossl_sleep_millis(uint64_t millis)
+{
+    const OSSL_TIME finish
+        = ossl_time_add(ossl_time_now(), ossl_ms2time(millis));
+
+    while (ossl_time_compare(ossl_time_now(), finish) < 0)
+        /* busy wait */ ;
+}
+
+void OSSL_sleep(uint64_t millis)
+{
+    ossl_sleep_secs(millis / 1000);
+    ossl_sleep_millis(millis % 1000);
+}
+#endif /* defined(OPENSSL_SYS_UNIX) || defined(__DJGPP__) */
index 809ffee95bb7b0edc52c7055e6aeb5cd05c66302..45886a4f27db1eb34d4bafddfe790a089576131f 100644 (file)
@@ -1723,6 +1723,10 @@ DEPEND[html/man3/OSSL_STORE_open.html]=man3/OSSL_STORE_open.pod
 GENERATE[html/man3/OSSL_STORE_open.html]=man3/OSSL_STORE_open.pod
 DEPEND[man/man3/OSSL_STORE_open.3]=man3/OSSL_STORE_open.pod
 GENERATE[man/man3/OSSL_STORE_open.3]=man3/OSSL_STORE_open.pod
+DEPEND[html/man3/OSSL_sleep.html]=man3/OSSL_sleep.pod
+GENERATE[html/man3/OSSL_sleep.html]=man3/OSSL_sleep.pod
+DEPEND[man/man3/OSSL_sleep.3]=man3/OSSL_sleep.pod
+GENERATE[man/man3/OSSL_sleep.3]=man3/OSSL_sleep.pod
 DEPEND[html/man3/OSSL_trace_enabled.html]=man3/OSSL_trace_enabled.pod
 GENERATE[html/man3/OSSL_trace_enabled.html]=man3/OSSL_trace_enabled.pod
 DEPEND[man/man3/OSSL_trace_enabled.3]=man3/OSSL_trace_enabled.pod
@@ -3194,6 +3198,7 @@ html/man3/OSSL_STORE_SEARCH.html \
 html/man3/OSSL_STORE_attach.html \
 html/man3/OSSL_STORE_expect.html \
 html/man3/OSSL_STORE_open.html \
+html/man3/OSSL_sleep.html \
 html/man3/OSSL_trace_enabled.html \
 html/man3/OSSL_trace_get_category_num.html \
 html/man3/OSSL_trace_set_channel.html \
@@ -3797,6 +3802,7 @@ man/man3/OSSL_STORE_SEARCH.3 \
 man/man3/OSSL_STORE_attach.3 \
 man/man3/OSSL_STORE_expect.3 \
 man/man3/OSSL_STORE_open.3 \
+man/man3/OSSL_sleep.3 \
 man/man3/OSSL_trace_enabled.3 \
 man/man3/OSSL_trace_get_category_num.3 \
 man/man3/OSSL_trace_set_channel.3 \
diff --git a/doc/man3/OSSL_sleep.pod b/doc/man3/OSSL_sleep.pod
new file mode 100644 (file)
index 0000000..5264d2b
--- /dev/null
@@ -0,0 +1,37 @@
+=pod
+
+=head1 NAME
+
+OSSL_sleep - delay execution for a specified number of milliseconds
+
+=head1 SYNOPSIS
+
+ #include <openssl/crypto.h>
+
+ void OSSL_sleep(uint64_t millis);
+
+=head1 DESCRIPTION
+
+OSSL_sleep() is a convenience function to delay execution of the calling
+thread for (at least) I<millis> milliseconds.  The delay is not guaranteed;
+it may be affected by system activity, by the time spent processing the call
+or by system timer granularity.
+
+=head1 RETURN VALUES
+
+OSSL_sleep() does not return any value.
+
+=head1 HISTORY
+
+OSSL_sleep() was added in OpenSSL 3.2.
+
+=head1 COPYRIGHT
+
+Copyright 2022 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
+L<https://www.openssl.org/source/license.html>.
+
+=cut
index 059fae40404f0713c24a4e2f657439d09f3f697b..6fc1c74c97c570d14deeca8ca1568f13d3323cbf 100644 (file)
@@ -286,50 +286,6 @@ struct servent *getservbyname(const char *name, const char *proto);
 # endif
 /* end vxworks */
 
-/* system-specific variants defining ossl_sleep() */
-#if defined(OPENSSL_SYS_UNIX) || defined(__DJGPP__)
-# include <unistd.h>
-static ossl_inline void ossl_sleep(unsigned long millis)
-{
-# ifdef OPENSSL_SYS_VXWORKS
-    struct timespec ts;
-    ts.tv_sec = (long int) (millis / 1000);
-    ts.tv_nsec = (long int) (millis % 1000) * 1000000ul;
-    nanosleep(&ts, NULL);
-# elif defined(__TANDEM)
-#  if !defined(_REENTRANT)
-#   include <cextdecs.h(PROCESS_DELAY_)>
-    /* HPNS does not support usleep for non threaded apps */
-    PROCESS_DELAY_(millis * 1000);
-#  elif defined(_SPT_MODEL_)
-#   include <spthread.h>
-#   include <spt_extensions.h>
-    usleep(millis * 1000);
-#  else
-    usleep(millis * 1000);
-#  endif
-# else
-    usleep(millis * 1000);
-# endif
-}
-#elif defined(_WIN32)
-# include <windows.h>
-static ossl_inline void ossl_sleep(unsigned long millis)
-{
-    Sleep(millis);
-}
-#else
-/* Fallback to a busy wait */
-# include "internal/time.h"
-static ossl_inline void ossl_sleep(unsigned long millis)
-{
-    const OSSL_TIME finish = ossl_time_add(ossl_time_now(), ossl_ms2time(millis));
-
-    while (ossl_time_compare(ossl_time_now(), finish) < 0)
-        /* busy wait */ ;
-}
-#endif /* defined OPENSSL_SYS_UNIX */
-
 /* ----------------------------- HP NonStop -------------------------------- */
 /* Required to support platform variant without getpid() and pid_t. */
 # if defined(__TANDEM) && defined(_GUARDIAN_TARGET)
index fb0c7cbb871784962dd1ed1c39dcfd70ad33f865..963bc635fb10299279bc7c692118624f7fe02c4c 100644 (file)
@@ -529,6 +529,8 @@ void OSSL_LIB_CTX_free(OSSL_LIB_CTX *);
 OSSL_LIB_CTX *OSSL_LIB_CTX_get0_global_default(void);
 OSSL_LIB_CTX *OSSL_LIB_CTX_set0_default(OSSL_LIB_CTX *libctx);
 
+void OSSL_sleep(uint64_t millis);
+
 # ifdef  __cplusplus
 }
 # endif
index 4c5cd7907d3a49797b37c4c5694acd74a09f20db..f9c1395859fe23b4905e39c292b780da3d0e5173 100644 (file)
@@ -5465,3 +5465,4 @@ EVP_PKEY_auth_encapsulate_init          ? 3_1_0   EXIST::FUNCTION:
 EVP_PKEY_auth_decapsulate_init          ?      3_1_0   EXIST::FUNCTION:
 PKCS12_SAFEBAG_set0_attrs               ?      3_1_0   EXIST::FUNCTION:
 PKCS12_create_ex2                       ?      3_1_0   EXIST::FUNCTION:
+OSSL_sleep                              ?      3_1_0   EXIST::FUNCTION: