random-util: use ssize_t for getrandom return value
authorMike Gilbert <floppym@gentoo.org>
Sat, 25 Dec 2021 00:20:36 +0000 (19:20 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 11 Jan 2022 18:44:09 +0000 (19:44 +0100)
This matches the prototype provided by glibc.

(cherry picked from commit 289b41aae7356b7a6c72ff4a3476193a084ff33f)
(cherry picked from commit 4d889024ef5ba1edc5d967a010a2551e0826e5d7)

src/basic/missing_syscall.h
src/basic/random-util.c

index 9e3a165857d8490290982da9bfd4a5a5de1ea3bc..279c5911bd649181852ec8d9d27bbb61f508e51a 100644 (file)
@@ -57,7 +57,8 @@ static inline int missing_memfd_create(const char *name, unsigned int flags) {
 /* ======================================================================= */
 
 #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
index c2be962355c7185a71cc0883cc4b2a3529b75ff0..e117330857c3cb6a0820d200c616f2861cc4ac99 100644 (file)
@@ -161,7 +161,6 @@ int genuine_random_bytes(void *p, size_t n, RandomFlags flags) {
         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
@@ -220,18 +219,19 @@ int genuine_random_bytes(void *p, size_t n, RandomFlags flags) {
         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 */
@@ -248,7 +248,7 @@ int genuine_random_bytes(void *p, size_t n, RandomFlags flags) {
                                 /* Fill in the rest with /dev/urandom */
                                 break;
 
-                        } else if (r == 0) {
+                        } else if (l == 0) {
                                 have_syscall = true;
                                 return -EIO;