Very limited backport of the following upstream commit, to obtain the definition of __getrandom_nocancel. commit 6f4e0fcfa2d2b0915816a3a3a1d48b4763a7dee2 Author: Adhemerval Zanella Netto Date: Thu Jul 21 10:04:59 2022 -0300 stdlib: Add arc4random, arc4random_buf, and arc4random_uniform (BZ #4417) With the INTERNAL_SYSCALL_CALL change from this patch already applied: commit 609c9d0951da387cd523b5db42a82d38dabc37c4 Author: Adhemerval Zanella Date: Thu Sep 29 16:18:06 2022 -0300 malloc: Do not clobber errno on __getrandom_nocancel (BZ #29624) Use INTERNAL_SYSCALL_CALL instead of INLINE_SYSCALL_CALL. This requires emulate the semantic for hurd call (so __arc4random_buf uses the fallback). Checked on x86_64-linux-gnu. Reviewed-by: Wilco Dijkstra diff --git a/sysdeps/generic/not-cancel.h b/sysdeps/generic/not-cancel.h index 8a3772a1fe66271e..14188041c2c0ad57 100644 --- a/sysdeps/generic/not-cancel.h +++ b/sysdeps/generic/not-cancel.h @@ -49,5 +49,7 @@ (void) __writev (fd, iov, n) #define __fcntl64_nocancel(fd, cmd, ...) \ __fcntl64 (fd, cmd, __VA_ARGS__) +#define __getrandom_nocancel(buf, size, flags) \ + __getrandom (buf, size, flags) #endif /* NOT_CANCEL_H */ diff --git a/sysdeps/mach/hurd/not-cancel.h b/sysdeps/mach/hurd/not-cancel.h index cd320cb721e6ff7e..7a3d2cc3532cf866 100644 --- a/sysdeps/mach/hurd/not-cancel.h +++ b/sysdeps/mach/hurd/not-cancel.h @@ -75,6 +75,9 @@ __typeof (__fcntl) __fcntl_nocancel; #define __fcntl64_nocancel(...) \ __fcntl_nocancel (__VA_ARGS__) +#define __getrandom_nocancel(buf, size, flags) \ + __getrandom (buf, size, flags) + #if IS_IN (libc) hidden_proto (__close_nocancel) hidden_proto (__close_nocancel_nostatus) diff --git a/sysdeps/unix/sysv/linux/not-cancel.h b/sysdeps/unix/sysv/linux/not-cancel.h index f06d57426a40227e..d2bb59acddbcfee0 100644 --- a/sysdeps/unix/sysv/linux/not-cancel.h +++ b/sysdeps/unix/sysv/linux/not-cancel.h @@ -68,6 +68,13 @@ __writev_nocancel_nostatus (int fd, const struct iovec *iov, int iovcnt) INTERNAL_SYSCALL_CALL (writev, fd, iov, iovcnt); } +static inline int +__getrandom_nocancel (void *buf, size_t buflen, unsigned int flags) +{ + return INTERNAL_SYSCALL_CALL (getrandom, buf, buflen, flags); +} + + /* Uncancelable fcntl. */ __typeof (__fcntl) __fcntl64_nocancel;