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) {