vendor/libsodium/src/libsodium/randombytes/sysrandom/randombytes_sysrandom.c in rbnacl-libsodium-1.0.11 vs vendor/libsodium/src/libsodium/randombytes/sysrandom/randombytes_sysrandom.c in rbnacl-libsodium-1.0.13

- old
+ new

@@ -1,27 +1,31 @@ -#include <stdlib.h> -#include <sys/types.h> -#ifndef _WIN32 -# include <sys/stat.h> -# include <sys/time.h> -#endif -#ifdef __linux__ -# include <sys/syscall.h> -# include <poll.h> -#endif - #include <assert.h> #include <errno.h> #include <fcntl.h> #include <limits.h> #include <stdint.h> #include <string.h> #ifndef _WIN32 # include <unistd.h> #endif +#include <stdlib.h> +#include <sys/types.h> +#ifndef _WIN32 +# include <sys/stat.h> +# include <sys/time.h> +#endif +#ifdef __linux__ +# ifdef __dietlibc__ +# define _LINUX_SOURCE +# else +# include <sys/syscall.h> +# endif +# include <poll.h> +#endif + #include "randombytes.h" #include "randombytes_sysrandom.h" #include "utils.h" #ifdef _WIN32 @@ -112,11 +116,11 @@ return (ssize_t) (buf - (unsigned char *) buf_); } #endif #ifndef _WIN32 -# if defined(__linux__) && !defined(USE_BLOCKING_RANDOM) +# if defined(__linux__) && !defined(USE_BLOCKING_RANDOM) && !defined(NO_BLOCKING_RANDOM_POLL) static int randombytes_block_on_dev_random(void) { struct pollfd pfd; int fd; @@ -153,11 +157,11 @@ "/dev/random", NULL }; const char ** device = devices; int fd; -# if defined(__linux__) && !defined(USE_BLOCKING_RANDOM) +# if defined(__linux__) && !defined(USE_BLOCKING_RANDOM) && !defined(NO_BLOCKING_RANDOM_POLL) if (randombytes_block_on_dev_random() != 0) { return -1; } # endif do { @@ -187,19 +191,23 @@ errno = EIO; return -1; /* LCOV_EXCL_STOP */ } -# if defined(SYS_getrandom) && defined(__NR_getrandom) +# if defined(__dietlibc__) || (defined(SYS_getrandom) && defined(__NR_getrandom)) static int _randombytes_linux_getrandom(void * const buf, const size_t size) { int readnb; assert(size <= 256U); do { +# ifdef __dietlibc__ + readnb = getrandom(buf, size, 0); +# else readnb = syscall(SYS_getrandom, buf, (int) size, 0); +# endif } while (readnb < 0 && (errno == EINTR || errno == EAGAIN)); return (readnb == (int) size) - 1; } @@ -303,12 +311,14 @@ static void randombytes_sysrandom_buf(void * const buf, const size_t size) { randombytes_sysrandom_stir_if_needed(); -#ifdef ULONG_LONG_MAX +#if defined(ULONG_LONG_MAX) && defined(SIZE_MAX) +# if SIZE_MAX > ULONG_LONG_MAX /* coverity[result_independent_of_operands] */ assert(size <= ULONG_LONG_MAX); +# endif #endif #ifndef _WIN32 # if defined(SYS_getrandom) && defined(__NR_getrandom) if (stream.getrandom_available != 0) { if (randombytes_linux_getrandom(buf, size) != 0) {