]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
syscall_random(): don't fail if the getentropy() function is a dummy
authorYury Is <yury.coder@gmail.com>
Mon, 12 Oct 2020 23:24:52 +0000 (02:24 +0300)
committerDr. Matthias St. Pierre <matthias.st.pierre@ncp-e.com>
Wed, 14 Oct 2020 05:52:39 +0000 (07:52 +0200)
Several embedded toolchains may provide dummy implemented getentropy()
function which always returns -1 and sets errno to the ENOSYS.

As a result the function SSL_CTX_new() fails to create a new context.

Fixes #13002

Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com>
(Merged from https://github.com/openssl/openssl/pull/13114)

providers/implementations/rands/seeding/rand_unix.c

index 26d81d605405f698ec0a4a34ca76bdff250a6482..ddd453fff8198cabd81b8dc23d25d56a64e70137 100644 (file)
@@ -376,12 +376,19 @@ static ssize_t syscall_random(void *buf, size_t buflen)
      * - OpenBSD since 5.6
      * - Linux since 3.17 with glibc 2.25
      * - FreeBSD since 12.0 (1200061)
+     *
+     * Note: Sometimes getentropy() can be provided but not implemented
+     * internally. So we need to check errno for ENOSYS
      */
 #  if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) && !defined(__hpux)
     extern int getentropy(void *buffer, size_t length) __attribute__((weak));
 
-    if (getentropy != NULL)
-        return getentropy(buf, buflen) == 0 ? (ssize_t)buflen : -1;
+    if (getentropy != NULL) {
+        if (getentropy(buf, buflen) == 0)
+            return (ssize_t)buflen;
+        if (errno != ENOSYS)
+            return -1;
+    }
 #  elif !defined(FIPS_MODULE)
     union {
         void *p;