about summary refs log tree commit diff
path: root/stdlib
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2024-04-05 10:27:29 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2024-07-08 10:05:10 -0300
commit184b9e530e6326e668709826903b6d30dc6cac3f (patch)
tree1f4f3ee49b062103ab63b85a65c268c1715482cf /stdlib
parent9fc639f654dc004736836613be703e6bed0c36a8 (diff)
downloadglibc-184b9e530e6326e668709826903b6d30dc6cac3f.tar.gz
glibc-184b9e530e6326e668709826903b6d30dc6cac3f.tar.xz
glibc-184b9e530e6326e668709826903b6d30dc6cac3f.zip
stdlib: fix arc4random fallback to /dev/urandom (BZ 31612)
The __getrandom_nocancel used by __arc4random_buf uses
INLINE_SYSCALL_CALL (which returns -1/errno) and the loop checks for
the return value instead of errno to fallback to /dev/urandom.

The malloc code now uses __getrandom_nocancel_nostatus, which uses
INTERNAL_SYSCALL_CALL, so there is no need to use the variant that does
not set errno (BZ#29624).

Checked on x86_64-linux-gnu.

Reviewed-by: Xi Ruoyao <xry111@xry111.site>
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/arc4random.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/stdlib/arc4random.c b/stdlib/arc4random.c
index 3ae8fc1302..7818cb9cf6 100644
--- a/stdlib/arc4random.c
+++ b/stdlib/arc4random.c
@@ -51,7 +51,7 @@ __arc4random_buf (void *p, size_t n)
 	  n -= l;
 	  continue; /* Interrupted by a signal; keep going.  */
 	}
-      else if (l == -ENOSYS)
+      else if (l < 0 && errno == ENOSYS)
 	break; /* No syscall, so fallback to /dev/urandom.  */
       arc4random_getrandom_failure ();
     }