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