]> granicus.if.org Git - json-c/commitdiff
Iesue #692: use arc4random() if it's available (in libc on BSD systems, and libbsd...
authorEric Haszlakiewicz <erh+git@nimenees.com>
Wed, 13 Jan 2021 01:57:25 +0000 (01:57 +0000)
committerEric Haszlakiewicz <erh+git@nimenees.com>
Wed, 13 Jan 2021 01:57:25 +0000 (01:57 +0000)
CMakeLists.txt
cmake/config.h.in
random_seed.c

index 892aebb8e8cfef22f631e768ddb0cd77a54cb7c5..30b4f2d2fa931d543ba8e5de379ec5f6f1364693 100644 (file)
@@ -170,6 +170,17 @@ check_symbol_exists(vasprintf       "stdio.h" HAVE_VASPRINTF)
 check_symbol_exists(vsnprintf       "stdio.h" HAVE_VSNPRINTF)
 check_symbol_exists(vprintf         "stdio.h" HAVE_VPRINTF)
 
+check_symbol_exists(arc4random      "stdlib.h" HAVE_ARC4RANDOM)
+if (NOT HAVE_ARC4RANDOM)
+    check_include_file(bsd/stdlib.h HAVE_BSD_STDLIB_H)
+    if (HAVE_BSD_STDLIB_H)
+               list(APPEND CMAKE_REQUIRED_LIBRARIES "-lbsd")
+               link_libraries(bsd)
+               unset(HAVE_ARC4RANDOM CACHE)
+        check_symbol_exists(arc4random   "bsd/stdlib.h" HAVE_ARC4RANDOM)
+    endif()
+endif()
+
 if (HAVE_FCNTL_H)
     check_symbol_exists(open        "fcntl.h" HAVE_OPEN)
 endif()
index 9e097cba30b608f5084d4f804f2ca1b910924c27..be0202aba95440dc489567f340b227f94e0c869b 100644 (file)
 /* Define to 1 if you have the <xlocale.h> header file. */
 #cmakedefine HAVE_XLOCALE_H
 
+/* Define to 1 if you have the <bsd/stdlib.h> header file. */
+#cmakedefine HAVE_BSD_STDLIB_H
+
+/* Define to 1 if you have `arc4random' */
+#cmakedefine HAVE_ARC4RANDOM
+
 /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
 #cmakedefine HAVE_DOPRNT
 
index ff5338f76300e50174c18481d7ba415c397c13bf..f3ee7406f44171f2c7a991ebfb82852889a8cb36 100644 (file)
 #include "config.h"
 #include "strerror_override.h"
 #include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_BSD_STDLIB_H
+#include <bsd/stdlib.h>
+#endif
 
 #define DEBUG_SEED(s)
 
@@ -168,7 +172,8 @@ static int get_getrandom_seed(int *seed)
 
        ssize_t ret;
 
-       do {
+       do
+       {
                ret = getrandom(seed, sizeof(*seed), GRND_NONBLOCK);
        } while ((ret == -1) && (errno == EINTR));
 
@@ -273,7 +278,7 @@ static int get_cryptgenrandom_seed(int *seed)
        }
        else
        {
-               BOOL ret = CryptGenRandom(hProvider, sizeof(*seed), (BYTE*)seed);
+               BOOL ret = CryptGenRandom(hProvider, sizeof(*seed), (BYTE *)seed);
                CryptReleaseContext(hProvider, 0);
                if (!ret)
                {
@@ -310,6 +315,10 @@ int json_c_get_random_seed(void)
        if (has_rdrand())
                return get_rdrand_seed();
 #endif
+#ifdef HAVE_ARC4RANDOM
+       /* arc4random never fails, so use it if it's available */
+       return arc4random();
+#endif
 #ifdef HAVE_GETRANDOM
        if (get_getrandom_seed(&seed) == 0)
                return seed;