From 1ad2c5da9420632775d4d9b230b59b667e857625 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Thu, 13 Aug 2026 16:56:39 -0500 Subject: [PATCH 1/5] Use kernel-provided __NR_getrandom syscall number Replace libc's SYS_getrandom with the kernel-provided __NR_getrandom in configure checks, os.getrandom(), and interpreter entropy handling. --- Modules/posixmodule.c | 2 +- Python/bootstrap_hash.c | 6 +++--- configure | 2 +- configure.ac | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index d94291e2ae524bc..00bf7d526711ba6 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -17440,7 +17440,7 @@ os_getrandom_impl(PyObject *module, Py_ssize_t size, unsigned int flags) #ifdef HAVE_GETRANDOM n = getrandom(data, size, flags); #else - n = syscall(SYS_getrandom, data, size, flags); + n = syscall(__NR_getrandom, data, size, flags); #endif if (n < 0 && errno == EINTR) { if (PyErr_CheckSignals() < 0) { diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c index 5bc45d503360376..ab91c853e98c155 100644 --- a/Python/bootstrap_hash.c +++ b/Python/bootstrap_hash.c @@ -23,7 +23,7 @@ # include // getrandom() # endif # if !defined(HAVE_GETRANDOM) && defined(HAVE_GETRANDOM_SYSCALL) -# include // SYS_getrandom +# include // __NR_getrandom # endif #endif @@ -128,11 +128,11 @@ py_getrandom(void *buffer, Py_ssize_t size, int blocking, int raise) #else if (raise) { Py_BEGIN_ALLOW_THREADS - n = syscall(SYS_getrandom, dest, n, flags); + n = syscall(__NR_getrandom, dest, n, flags); Py_END_ALLOW_THREADS } else { - n = syscall(SYS_getrandom, dest, n, flags); + n = syscall(__NR_getrandom, dest, n, flags); } # ifdef _Py_MEMORY_SANITIZER if (n > 0) { diff --git a/configure b/configure index 598a21fb31f7501..9b3a743a4afd7d1 100755 --- a/configure +++ b/configure @@ -34096,7 +34096,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext const size_t buflen = sizeof(buffer); const int flags = GRND_NONBLOCK; /* ignore the result, Python checks for ENOSYS and EAGAIN at runtime */ - (void)syscall(SYS_getrandom, buffer, buflen, flags); + (void)syscall(__NR_getrandom, buffer, buflen, flags); return 0; } diff --git a/configure.ac b/configure.ac index 47c5f7e49422a5d..aa9a0d9f36c9785 100644 --- a/configure.ac +++ b/configure.ac @@ -7812,7 +7812,7 @@ AC_LINK_IFELSE( const size_t buflen = sizeof(buffer); const int flags = GRND_NONBLOCK; /* ignore the result, Python checks for ENOSYS and EAGAIN at runtime */ - (void)syscall(SYS_getrandom, buffer, buflen, flags); + (void)syscall(__NR_getrandom, buffer, buflen, flags); return 0; } ]]) From 5748e1066919726ac330f05db702c72ae073c1fe Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 14 Aug 2026 14:45:10 -0500 Subject: [PATCH 2/5] 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. --- Modules/posixmodule.c | 5 ++++- Python/bootstrap_hash.c | 9 ++++++--- configure | 6 +++++- configure.ac | 6 +++++- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 00bf7d526711ba6..7838dd5497e3e5a 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -160,6 +160,9 @@ #ifdef HAVE_SYS_SYSCALL_H # include // syscall(), __NR_xxx syscall numbers #endif +#if !defined(SYS_getrandom) && defined(__NR_getrandom) +# define SYS_getrandom __NR_getrandom +#endif #ifdef HAVE_POSIX_SPAWN # include // posix_spawn() @@ -17440,7 +17443,7 @@ os_getrandom_impl(PyObject *module, Py_ssize_t size, unsigned int flags) #ifdef HAVE_GETRANDOM n = getrandom(data, size, flags); #else - n = syscall(__NR_getrandom, data, size, flags); + n = syscall(SYS_getrandom, data, size, flags); #endif if (n < 0 && errno == EINTR) { if (PyErr_CheckSignals() < 0) { diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c index ab91c853e98c155..a22688827612657 100644 --- a/Python/bootstrap_hash.c +++ b/Python/bootstrap_hash.c @@ -23,7 +23,10 @@ # include // getrandom() # endif # if !defined(HAVE_GETRANDOM) && defined(HAVE_GETRANDOM_SYSCALL) -# include // __NR_getrandom +# include // __NR_getrandom, SYS_getrandom +# if !defined(SYS_getrandom) && defined(__NR_getrandom) +# define SYS_getrandom __NR_getrandom +# endif # endif #endif @@ -128,11 +131,11 @@ py_getrandom(void *buffer, Py_ssize_t size, int blocking, int raise) #else if (raise) { Py_BEGIN_ALLOW_THREADS - n = syscall(__NR_getrandom, dest, n, flags); + n = syscall(SYS_getrandom, dest, n, flags); Py_END_ALLOW_THREADS } else { - n = syscall(__NR_getrandom, dest, n, flags); + n = syscall(SYS_getrandom, dest, n, flags); } # ifdef _Py_MEMORY_SANITIZER if (n > 0) { diff --git a/configure b/configure index 9b3a743a4afd7d1..a7743f2e892b82c 100755 --- a/configure +++ b/configure @@ -34091,12 +34091,16 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #include #include + #if !defined(SYS_getrandom) && defined(__NR_getrandom) + # define SYS_getrandom __NR_getrandom + #endif + int main(void) { char buffer[1]; const size_t buflen = sizeof(buffer); const int flags = GRND_NONBLOCK; /* ignore the result, Python checks for ENOSYS and EAGAIN at runtime */ - (void)syscall(__NR_getrandom, buffer, buflen, flags); + (void)syscall(SYS_getrandom, buffer, buflen, flags); return 0; } diff --git a/configure.ac b/configure.ac index aa9a0d9f36c9785..c6cc5d9b7a2f559 100644 --- a/configure.ac +++ b/configure.ac @@ -7807,12 +7807,16 @@ AC_LINK_IFELSE( #include #include + #if !defined(SYS_getrandom) && defined(__NR_getrandom) + # define SYS_getrandom __NR_getrandom + #endif + int main(void) { char buffer[1]; const size_t buflen = sizeof(buffer); const int flags = GRND_NONBLOCK; /* ignore the result, Python checks for ENOSYS and EAGAIN at runtime */ - (void)syscall(__NR_getrandom, buffer, buflen, flags); + (void)syscall(SYS_getrandom, buffer, buflen, flags); return 0; } ]]) From d17f8b7b49adefd87a325ce6486154b55f7ac651 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 14 Aug 2026 15:10:48 -0500 Subject: [PATCH 3/5] Document GRND_NONBLOCK dependency in getrandom check --- configure | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 16a98d6e36f63c6..af3d65cac1b35f8 100755 --- a/configure +++ b/configure @@ -34261,7 +34261,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #include #include #include - #include + #include // GRND_NONBLOCK #if !defined(SYS_getrandom) && defined(__NR_getrandom) # define SYS_getrandom __NR_getrandom diff --git a/configure.ac b/configure.ac index 079697f27c990a7..6c6dc9c75fe1ad6 100644 --- a/configure.ac +++ b/configure.ac @@ -7872,7 +7872,7 @@ AC_LINK_IFELSE( #include #include #include - #include + #include // GRND_NONBLOCK #if !defined(SYS_getrandom) && defined(__NR_getrandom) # define SYS_getrandom __NR_getrandom From 7e094cf8f16f9d2a5612d762d15a693bb4ad5828 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 20:16:56 +0000 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst diff --git a/Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst b/Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst new file mode 100644 index 000000000000000..38eb51fa311562f --- /dev/null +++ b/Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst @@ -0,0 +1 @@ +Fall back to the kernel-provided __NR_getrandom in configure checks, os.getrandom(), and interpreter entropy handling when libc SYS_getrandom is not available. From d79023d3b4fd136ac012ee03067d1891c08f5a1e Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Thu, 10 Sep 2026 14:47:04 -0500 Subject: [PATCH 5/5] update NEWS blurb --- .../next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst b/Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst index 38eb51fa311562f..17241c897905b0e 100644 --- a/Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst +++ b/Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst @@ -1 +1 @@ -Fall back to the kernel-provided __NR_getrandom in configure checks, os.getrandom(), and interpreter entropy handling when libc SYS_getrandom is not available. +Support os.getrandom() when building Python with old glibc versions and recent Linux kernel (glibc 2.25 or older and Linux kernel 3.17 or newer). Get the syscall number from kernel headers, rather than glibc headers.