Skip to content

Commit 5748e10

Browse files
committed
Prefer SYS_getrandom with __NR_getrandom fallback
Use the libc-provided SYS_getrandom syscall number when available, falling back to the kernel-provided __NR_getrandom when necessary.
1 parent 1ad2c5d commit 5748e10

4 files changed

Lines changed: 20 additions & 6 deletions

File tree

Modules/posixmodule.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@
160160
#ifdef HAVE_SYS_SYSCALL_H
161161
# include <sys/syscall.h> // syscall(), __NR_xxx syscall numbers
162162
#endif
163+
#if !defined(SYS_getrandom) && defined(__NR_getrandom)
164+
# define SYS_getrandom __NR_getrandom
165+
#endif
163166

164167
#ifdef HAVE_POSIX_SPAWN
165168
# include <spawn.h> // posix_spawn()
@@ -17440,7 +17443,7 @@ os_getrandom_impl(PyObject *module, Py_ssize_t size, unsigned int flags)
1744017443
#ifdef HAVE_GETRANDOM
1744117444
n = getrandom(data, size, flags);
1744217445
#else
17443-
n = syscall(__NR_getrandom, data, size, flags);
17446+
n = syscall(SYS_getrandom, data, size, flags);
1744417447
#endif
1744517448
if (n < 0 && errno == EINTR) {
1744617449
if (PyErr_CheckSignals() < 0) {

Python/bootstrap_hash.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
# include <sys/random.h> // getrandom()
2424
# endif
2525
# if !defined(HAVE_GETRANDOM) && defined(HAVE_GETRANDOM_SYSCALL)
26-
# include <sys/syscall.h> // __NR_getrandom
26+
# include <sys/syscall.h> // __NR_getrandom, SYS_getrandom
27+
# if !defined(SYS_getrandom) && defined(__NR_getrandom)
28+
# define SYS_getrandom __NR_getrandom
29+
# endif
2730
# endif
2831
#endif
2932

@@ -128,11 +131,11 @@ py_getrandom(void *buffer, Py_ssize_t size, int blocking, int raise)
128131
#else
129132
if (raise) {
130133
Py_BEGIN_ALLOW_THREADS
131-
n = syscall(__NR_getrandom, dest, n, flags);
134+
n = syscall(SYS_getrandom, dest, n, flags);
132135
Py_END_ALLOW_THREADS
133136
}
134137
else {
135-
n = syscall(__NR_getrandom, dest, n, flags);
138+
n = syscall(SYS_getrandom, dest, n, flags);
136139
}
137140
# ifdef _Py_MEMORY_SANITIZER
138141
if (n > 0) {

configure

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

configure.ac

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7807,12 +7807,16 @@ AC_LINK_IFELSE(
78077807
#include <sys/syscall.h>
78087808
#include <linux/random.h>
78097809
7810+
#if !defined(SYS_getrandom) && defined(__NR_getrandom)
7811+
# define SYS_getrandom __NR_getrandom
7812+
#endif
7813+
78107814
int main(void) {
78117815
char buffer[1];
78127816
const size_t buflen = sizeof(buffer);
78137817
const int flags = GRND_NONBLOCK;
78147818
/* ignore the result, Python checks for ENOSYS and EAGAIN at runtime */
7815-
(void)syscall(__NR_getrandom, buffer, buflen, flags);
7819+
(void)syscall(SYS_getrandom, buffer, buflen, flags);
78167820
return 0;
78177821
}
78187822
]])

0 commit comments

Comments
 (0)