From a9ea218e7e119d7d7d050156835d4e16f41d0a6c Mon Sep 17 00:00:00 2001 From: Sergey Kandaurov Date: Thu, 24 May 2018 20:35:47 +0300 Subject: [PATCH] Using getrandom() libc interface, SYS_getrandom fixes. The interface is available since Glibc 2.25, and FreeBSD 12.0. --- auto/unix | 34 ++++++++++++++++++++++++++++++---- src/nxt_random.c | 8 ++++++-- src/nxt_unix.h | 10 ++++++---- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/auto/unix b/auto/unix index acacce0d..b6763852 100644 --- a/auto/unix +++ b/auto/unix @@ -3,25 +3,51 @@ # Copyright (C) NGINX, Inc. -# Linux 3.17 getrandom(). +# getrandom(). nxt_feature="getrandom()" nxt_feature_name=NXT_HAVE_GETRANDOM -nxt_feature_run= +nxt_feature_run=yes nxt_feature_incs= nxt_feature_libs= -nxt_feature_test="#include +nxt_feature_test="#include + #include int main() { char buf[4]; - (void) getrandom(buf, 4, 0); + if (getrandom(buf, 4, 0) < 0) { + return 1; + } return 0; }" . auto/feature +if [ $nxt_found = no ]; then + + # Linux 3.17 SYS_getrandom. + + nxt_feature="SYS_getrandom in Linux" + nxt_feature_name=NXT_HAVE_LINUX_SYS_GETRANDOM + nxt_feature_test="#include + #include + #include + + int main() { + char buf[4]; + + if (syscall(SYS_getrandom, buf, 4, 0) < 0) { + return 1; + } + + return 0; + }" + . auto/feature +fi + + nxt_feature="ucontext" nxt_feature_name=NXT_HAVE_UCONTEXT nxt_feature_run= diff --git a/src/nxt_random.c b/src/nxt_random.c index 3dde1f15..27387b1f 100644 --- a/src/nxt_random.c +++ b/src/nxt_random.c @@ -62,9 +62,13 @@ nxt_random_stir(nxt_random_t *r) #if (NXT_HAVE_GETRANDOM) - /* Linux 3.17 getrandom(). */ + n = getrandom(&key, NXT_RANDOM_KEY_SIZE, 0); - n = getrandom(key, NXT_RANDOM_KEY_SIZE, 0); +#elif (NXT_HAVE_LINUX_SYS_GETRANDOM) + + /* Linux 3.17 SYS_getrandom. */ + + n = syscall(SYS_getrandom, &key, NXT_RANDOM_KEY_SIZE, 0); #endif diff --git a/src/nxt_unix.h b/src/nxt_unix.h index d61f00bc..33e9f247 100644 --- a/src/nxt_unix.h +++ b/src/nxt_unix.h @@ -32,10 +32,6 @@ #include /* malloc_usable_size(). */ #include /* syscall(SYS_gettid). */ -#if (NXT_GETRANDOM) -#include /* getrandom(). */ -#endif - #if (__GLIBC__ >= 2 && __GLIBC_MINOR__ >= 4) /* * POSIX semaphores using NPTL atomic/futex operations @@ -234,6 +230,12 @@ #include #endif +#if (NXT_HAVE_GETRANDOM) +#include /* getrandom(). */ +#elif (NXT_HAVE_LINUX_SYS_GETRANDOM) +#include /* SYS_getrandom. */ +#endif + #if (NXT_TEST_BUILD) #include