diff options
-rw-r--r-- | CMakeLists.txt | 8 | ||||
-rw-r--r-- | arc4random.c | 30 | ||||
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | event-config.h.cmake | 10 |
4 files changed, 28 insertions, 25 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index f0e046ae..6a49253b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -365,6 +365,11 @@ if(EVENT__HAVE_SYS_SOCKET_H) list(APPEND CMAKE_EXTRA_INCLUDE_FILES sys/socket.h) endif() +CHECK_INCLUDE_FILE(sys/random.h EVENT__HAVE_SYS_RANDOM_H) +if(EVENT__HAVE_SYS_RANDOM_H) + list(APPEND CMAKE_EXTRA_INCLUDE_FILES sys/random.h) +endif() + CHECK_INCLUDE_FILE(netinet/in.h EVENT__HAVE_NETINET_IN_H) if(EVENT__HAVE_NETINET_IN_H) list(APPEND CMAKE_EXTRA_INCLUDE_FILES netinet/in.h) @@ -559,9 +564,8 @@ CHECK_SYMBOL_EXISTS("__FUNCTION__" "" EVENT__HAVE___FUNCTION__) CHECK_SYMBOL_EXISTS(TAILQ_FOREACH sys/queue.h EVENT__HAVE_TAILQFOREACH) CHECK_CONST_EXISTS(CTL_KERN sys/sysctl.h EVENT__HAVE_DECL_CTL_KERN) CHECK_CONST_EXISTS(KERN_ARND sys/sysctl.h EVENT__HAVE_DECL_KERN_ARND) -CHECK_CONST_EXISTS(KERN_RANDOM sys/sysctl.h EVENT__HAVE_DECL_KERN_RANDOM) -CHECK_CONST_EXISTS(RANDOM_UUID sys/sysctl.h EVENT__HAVE_DECL_RANDOM_UUID) CHECK_SYMBOL_EXISTS(F_SETFD fcntl.h EVENT__HAVE_SETFD) +CHECK_FUNCTION_EXISTS_EX(getrandom EVENT__HAVE_GETRANDOM) CHECK_TYPE_SIZE(fd_mask EVENT__HAVE_FD_MASK) diff --git a/arc4random.c b/arc4random.c index be64452b..8729f6b9 100644 --- a/arc4random.c +++ b/arc4random.c @@ -63,6 +63,9 @@ #ifdef EVENT__HAVE_SYS_SYSCTL_H #include <sys/sysctl.h> #endif +#ifdef EVENT__HAVE_SYS_RANDOM_H +#include <sys/random.h> +#endif #endif #include <limits.h> #include <stdlib.h> @@ -167,17 +170,11 @@ arc4_seed_win32(void) } #endif -#if defined(EVENT__HAVE_SYS_SYSCTL_H) && defined(EVENT__HAVE_SYSCTL) -#if EVENT__HAVE_DECL_CTL_KERN && EVENT__HAVE_DECL_KERN_RANDOM && EVENT__HAVE_DECL_RANDOM_UUID -#define TRY_SEED_SYSCTL_LINUX +#if defined(EVENT__HAVE_GETRANDOM) +#define TRY_SEED_GETRANDOM static int -arc4_seed_sysctl_linux(void) +arc4_seed_getrandom(void) { - /* Based on code by William Ahern, this function tries to use the - * RANDOM_UUID sysctl to get entropy from the kernel. This can work - * even if /dev/urandom is inaccessible for some reason (e.g., we're - * running in a chroot). */ - int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID }; unsigned char buf[ADD_ENTROPY]; size_t len, n; unsigned i; @@ -188,7 +185,7 @@ arc4_seed_sysctl_linux(void) for (len = 0; len < sizeof(buf); len += n) { n = sizeof(buf) - len; - if (0 != sysctl(mib, 3, &buf[len], &n, NULL, 0)) + if (0 == getrandom(&buf[len], n, 0)) return -1; } /* make sure that the buffer actually got set. */ @@ -202,8 +199,9 @@ arc4_seed_sysctl_linux(void) evutil_memclear_(buf, sizeof(buf)); return 0; } -#endif +#endif /* EVENT__HAVE_GETRANDOM */ +#if defined(EVENT__HAVE_SYS_SYSCTL_H) && defined(EVENT__HAVE_SYSCTL) #if EVENT__HAVE_DECL_CTL_KERN && EVENT__HAVE_DECL_KERN_ARND #define TRY_SEED_SYSCTL_BSD static int @@ -342,6 +340,10 @@ arc4_seed(void) if (0 == arc4_seed_win32()) ok = 1; #endif +#ifdef TRY_SEED_GETRANDOM + if (0 == arc4_seed_getrandom()) + ok = 1; +#endif #ifdef TRY_SEED_URANDOM if (0 == arc4_seed_urandom()) ok = 1; @@ -351,12 +353,6 @@ arc4_seed(void) 0 == arc4_seed_proc_sys_kernel_random_uuid()) ok = 1; #endif -#ifdef TRY_SEED_SYSCTL_LINUX - /* Apparently Linux is deprecating sysctl, and spewing warning - * messages when you try to use it. */ - if (!ok && 0 == arc4_seed_sysctl_linux()) - ok = 1; -#endif #ifdef TRY_SEED_SYSCTL_BSD if (0 == arc4_seed_sysctl_bsd()) ok = 1; diff --git a/configure.ac b/configure.ac index 8dd1aaa5..b584341c 100644 --- a/configure.ac +++ b/configure.ac @@ -248,6 +248,7 @@ AC_CHECK_HEADERS([ \ sys/timerfd.h \ sys/uio.h \ sys/wait.h \ + sys/random.h \ errno.h \ ]) @@ -256,6 +257,7 @@ AC_CHECK_HEADERS(sys/sysctl.h, [], [], [ #include <sys/param.h> #endif ]) + if test "x$ac_cv_header_sys_queue_h" = "xyes"; then AC_MSG_CHECKING(for TAILQ_FOREACH in sys/queue.h) AC_EGREP_CPP(yes, @@ -328,7 +330,7 @@ if test "x$ac_cv_header_sys_time_h" = "xyes"; then fi if test "x$ac_cv_header_sys_sysctl_h" = "xyes"; then - AC_CHECK_DECLS([CTL_KERN, KERN_RANDOM, RANDOM_UUID, KERN_ARND], [], [], + AC_CHECK_DECLS([CTL_KERN, KERN_ARND], [], [], [[#include <sys/types.h> #include <sys/sysctl.h>]] ) @@ -390,6 +392,7 @@ AC_CHECK_FUNCS([ \ usleep \ vasprintf \ getservbyname \ + getrandom \ ]) AM_CONDITIONAL(STRLCPY_IMPL, [test x"$ac_cv_func_strlcpy" = xno]) diff --git a/event-config.h.cmake b/event-config.h.cmake index a1b39a11..87551d7f 100644 --- a/event-config.h.cmake +++ b/event-config.h.cmake @@ -75,11 +75,8 @@ /* Define to 1 if you have the declaration of `KERN_ARND'. */ #define EVENT__HAVE_DECL_KERN_ARND @EVENT__HAVE_DECL_KERN_ARND@ -/* Define to 1 if you have the declaration of `KERN_RANDOM'. */ -#define EVENT__HAVE_DECL_KERN_RANDOM @EVENT__HAVE_DECL_KERN_RANDOM@ - -/* Define to 1 if you have the declaration of `RANDOM_UUID'. */ -#define EVENT__HAVE_DECL_RANDOM_UUID @EVENT__HAVE_DECL_RANDOM_UUID@ +/* Define to 1 if you have `getrandom' function. */ +#define EVENT__HAVE_GETRANDOM @EVENT__HAVE_GETRANDOM@ /* Define if /dev/poll is available */ #cmakedefine EVENT__HAVE_DEVPOLL 1 @@ -370,6 +367,9 @@ /* Define to 1 if you have the <sys/stat.h> header file. */ #cmakedefine EVENT__HAVE_SYS_STAT_H 1 +/* Define to 1 if you have the <sys/random.h> header file. */ +#cmakedefine EVENT__HAVE_SYS_RANDOM_H 1 + /* Define to 1 if you have the <sys/sysctl.h> header file. */ #cmakedefine EVENT__HAVE_SYS_SYSCTL_H 1 |