If arc4random is used, don't bother compiling in the other fallback methods since they'll never be used. Fixes PR#695 about unreachable code too.

This commit is contained in:
Eric Haszlakiewicz
2021-02-13 03:23:58 +00:00
parent 7c859c54e4
commit f787810890

View File

@@ -20,6 +20,16 @@
#define DEBUG_SEED(s) #define DEBUG_SEED(s)
#if defined(__APPLE__) || defined(__unix__) || defined(__linux__)
#define HAVE_DEV_RANDOM 1
#endif
#ifdef HAVE_ARC4RANDOM
#undef HAVE_GETRANDOM
#undef HAVE_DEV_RANDOM
#undef HAVE_CRYPTGENRANDOM
#endif
#if defined ENABLE_RDRAND #if defined ENABLE_RDRAND
/* cpuid */ /* cpuid */
@@ -197,7 +207,7 @@ static int get_getrandom_seed(int *seed)
/* get_dev_random_seed */ /* get_dev_random_seed */
#if defined(__APPLE__) || defined(__unix__) || defined(__linux__) #ifdef HAVE_DEV_RANDOM
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
@@ -207,8 +217,6 @@ static int get_getrandom_seed(int *seed)
#include <stdlib.h> #include <stdlib.h>
#include <sys/stat.h> #include <sys/stat.h>
#define HAVE_DEV_RANDOM 1
static const char *dev_random_file = "/dev/urandom"; static const char *dev_random_file = "/dev/urandom";
static int get_dev_random_seed(int *seed) static int get_dev_random_seed(int *seed)
@@ -294,6 +302,7 @@ static int get_cryptgenrandom_seed(int *seed)
/* get_time_seed */ /* get_time_seed */
#ifndef HAVE_ARC4RANDOM
#include <time.h> #include <time.h>
static int get_time_seed(void) static int get_time_seed(void)
@@ -302,12 +311,12 @@ static int get_time_seed(void)
return (unsigned)time(NULL) * 433494437; return (unsigned)time(NULL) * 433494437;
} }
#endif
/* json_c_get_random_seed */ /* json_c_get_random_seed */
int json_c_get_random_seed(void) int json_c_get_random_seed(void)
{ {
int seed;
#ifdef OVERRIDE_GET_RANDOM_SEED #ifdef OVERRIDE_GET_RANDOM_SEED
OVERRIDE_GET_RANDOM_SEED; OVERRIDE_GET_RANDOM_SEED;
#endif #endif
@@ -318,18 +327,28 @@ int json_c_get_random_seed(void)
#ifdef HAVE_ARC4RANDOM #ifdef HAVE_ARC4RANDOM
/* arc4random never fails, so use it if it's available */ /* arc4random never fails, so use it if it's available */
return arc4random(); return arc4random();
#endif #else
#ifdef HAVE_GETRANDOM #ifdef HAVE_GETRANDOM
if (get_getrandom_seed(&seed) == 0) {
return seed; int seed;
if (get_getrandom_seed(&seed) == 0)
return seed;
}
#endif #endif
#if defined HAVE_DEV_RANDOM && HAVE_DEV_RANDOM #if defined HAVE_DEV_RANDOM && HAVE_DEV_RANDOM
if (get_dev_random_seed(&seed) == 0) {
return seed; int seed;
if (get_dev_random_seed(&seed) == 0)
return seed;
}
#endif #endif
#if defined HAVE_CRYPTGENRANDOM && HAVE_CRYPTGENRANDOM #if defined HAVE_CRYPTGENRANDOM && HAVE_CRYPTGENRANDOM
if (get_cryptgenrandom_seed(&seed) == 0) {
return seed; int seed;
if (get_cryptgenrandom_seed(&seed) == 0)
return seed;
}
#endif #endif
return get_time_seed(); return get_time_seed();
#endif /* !HAVE_ARC4RANDOM */
} }