/* ======================================================================= */
#if !HAVE_GETRANDOM
-static inline int missing_getrandom(void *buffer, size_t count, unsigned flags) {
+/* glibc says getrandom() returns ssize_t */
+static inline ssize_t missing_getrandom(void *buffer, size_t count, unsigned flags) {
# ifdef __NR_getrandom
return syscall(__NR_getrandom, buffer, count, flags);
# else
static int have_syscall = -1;
_cleanup_close_ int fd = -1;
bool got_some = false;
- int r;
/* Gathers some high-quality randomness from the kernel (or potentially mid-quality randomness from
* the CPU if the RANDOM_ALLOW_RDRAND flag is set). This call won't block, unless the RANDOM_BLOCK
if (have_syscall != 0 && !HAS_FEATURE_MEMORY_SANITIZER) {
for (;;) {
- r = getrandom(p, n,
+ ssize_t l;
+ l = getrandom(p, n,
(FLAGS_SET(flags, RANDOM_BLOCK) ? 0 : GRND_NONBLOCK) |
(FLAGS_SET(flags, RANDOM_ALLOW_INSECURE) ? GRND_INSECURE : 0));
- if (r > 0) {
+ if (l > 0) {
have_syscall = true;
- if ((size_t) r == n)
+ if ((size_t) l == n)
return 0; /* Yay, success! */
- assert((size_t) r < n);
- p = (uint8_t*) p + r;
- n -= r;
+ assert((size_t) l < n);
+ p = (uint8_t*) p + l;
+ n -= l;
if (FLAGS_SET(flags, RANDOM_EXTEND_WITH_PSEUDO)) {
/* Fill in the remaining bytes using pseudo-random values */
/* Fill in the rest with /dev/urandom */
break;
- } else if (r == 0) {
+ } else if (l == 0) {
have_syscall = true;
return -EIO;