Browse Source

Iesue #692: use arc4random() if it's available (in libc on BSD systems, and libbsd on Linux).

tags/json-c-0.16-20220414
Eric Haszlakiewicz 4 years ago
parent
commit
0f61f6921b
3 changed files with 28 additions and 2 deletions
  1. +11
    -0
      CMakeLists.txt
  2. +6
    -0
      cmake/config.h.in
  3. +11
    -2
      random_seed.c

+ 11
- 0
CMakeLists.txt View 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()


+ 6
- 0
cmake/config.h.in View File

@@ -74,6 +74,12 @@
/* 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



+ 11
- 2
random_seed.c View File

@@ -13,6 +13,10 @@
#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;


Loading…
Cancel
Save