aboutsummaryrefslogtreecommitdiff
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:23:10 -0300
commita03631124602f2dcef40d46660b96d2e51c44bfd (patch)
tree9a6009db7fe617f6f64fd5002a473c6a06225018
parentd2cbfcf1d9a4b539007fe04d33e0bdb82d02a2f2 (diff)
downloadglibc-release/2.39/master.zip
glibc-release/2.39/master.tar.gz
glibc-release/2.39/master.tar.bz2
stdlib: fix arc4random fallback to /dev/urandom (BZ 31612)release/2.39/master
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> (cherry picked from commit 184b9e530e6326e668709826903b6d30dc6cac3f)
-rw-r--r--NEWS2
-rw-r--r--stdlib/arc4random.c2
2 files changed, 3 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 2a40238..4eadd9e 100644
--- a/NEWS
+++ b/NEWS
@@ -50,6 +50,8 @@ The following bugs are resolved with this release:
saved registers
[31429] build: Glibc failed to build with -march=x86-64-v3
[31501] dynamic-link: _dl_tlsdesc_dynamic_xsavec may clobber %rbx
+ [31612] libc: arc4random fails to fallback to /dev/urandom if
+ getrandom is not present
[31640] dynamic-link: POWER10 ld.so crashes in
elf_machine_load_address with GCC 14
[31676] Configuring with CC="gcc -march=x86-64-v3"
diff --git a/stdlib/arc4random.c b/stdlib/arc4random.c
index 3ae8fc1..7818cb9 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 ();
}