[PATCH v4] stdlib: Consolidate getentropy and adapt to POSIX 2024 semantics
Adhemerval Zanella
adhemerval.zanella@linaro.org
Mon Jun 30 19:04:41 GMT 2025
POSIX.1-2024 added getentropy with some slight different semantics,
where buffer larger than 256 (GETENTROPY_MAX) should return EINVAL
insted of EIO.
So a a new compat symbol is added to return EIO for large buffer, and
if no entropy could ge obtained from __getrandom_nocancel.
This patch does not move getentropy definition to unistd.h nor
add GETENTROPY_MAX on limits.h, since glibc still does not have a
preprocessor handling for POSIX 2024.
The consolidation uses __getrandom_nocancel, which might uses
the vDSO implementation if supported.
Checked on x86_64-linux-gnu.
--
Changes from v3:
* Rebase against master.
---
NEWS | 3 +
manual/crypt.texi | 2 +-
stdlib/Makefile | 8 ++
stdlib/Versions | 1 +
stdlib/getentropy.c | 59 +++++++++-
stdlib/tst-getentropy-compat.c | 26 +++++
stdlib/tst-getentropy.c | 108 ++++++++++++++++++
stdlib/tst-getrandom.c | 71 +-----------
sysdeps/mach/hurd/getentropy.c | 59 ----------
sysdeps/mach/hurd/i386/libc.abilist | 3 +-
sysdeps/mach/hurd/x86_64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/aarch64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/alpha/libc.abilist | 1 +
sysdeps/unix/sysv/linux/arc/libc.abilist | 1 +
sysdeps/unix/sysv/linux/arm/be/libc.abilist | 1 +
sysdeps/unix/sysv/linux/arm/le/libc.abilist | 1 +
sysdeps/unix/sysv/linux/csky/libc.abilist | 1 +
sysdeps/unix/sysv/linux/getentropy.c | 65 -----------
sysdeps/unix/sysv/linux/hppa/libc.abilist | 1 +
sysdeps/unix/sysv/linux/i386/libc.abilist | 1 +
.../sysv/linux/loongarch/lp64/libc.abilist | 1 +
.../sysv/linux/m68k/coldfire/libc.abilist | 1 +
.../unix/sysv/linux/m68k/m680x0/libc.abilist | 1 +
.../sysv/linux/microblaze/be/libc.abilist | 1 +
.../sysv/linux/microblaze/le/libc.abilist | 1 +
.../sysv/linux/mips/mips32/fpu/libc.abilist | 1 +
.../sysv/linux/mips/mips64/n32/libc.abilist | 1 +
.../sysv/linux/mips/mips64/n64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/or1k/libc.abilist | 1 +
.../linux/powerpc/powerpc32/fpu/libc.abilist | 1 +
.../powerpc/powerpc32/nofpu/libc.abilist | 1 +
.../linux/powerpc/powerpc64/be/libc.abilist | 1 +
.../linux/powerpc/powerpc64/le/libc.abilist | 1 +
.../unix/sysv/linux/riscv/rv32/libc.abilist | 1 +
.../unix/sysv/linux/riscv/rv64/libc.abilist | 1 +
.../unix/sysv/linux/s390/s390-32/libc.abilist | 1 +
.../unix/sysv/linux/s390/s390-64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/sh/be/libc.abilist | 1 +
sysdeps/unix/sysv/linux/sh/le/libc.abilist | 1 +
.../sysv/linux/sparc/sparc32/libc.abilist | 1 +
.../sysv/linux/sparc/sparc64/libc.abilist | 1 +
.../unix/sysv/linux/x86_64/64/libc.abilist | 1 +
.../unix/sysv/linux/x86_64/x32/libc.abilist | 1 +
43 files changed, 236 insertions(+), 201 deletions(-)
create mode 100644 stdlib/tst-getentropy-compat.c
create mode 100644 stdlib/tst-getentropy.c
delete mode 100644 sysdeps/mach/hurd/getentropy.c
delete mode 100644 sysdeps/unix/sysv/linux/getentropy.c
diff --git a/NEWS b/NEWS
index cc668344c1..247971ab28 100644
--- a/NEWS
+++ b/NEWS
@@ -37,6 +37,9 @@ Deprecated and removed features, and other changes affecting compatibility:
obsolete since the very first version of POSIX.1 in 1988, replaced
with <termios.h>.
+* The getentropy function now follows POSIX 2024, which means that
+ unsupportd large buffer will return EINVAL instead of EIO.
+
Changes to build and runtime requirements:
* GCC 12.1 or later is now required to build the GNU C Library.
diff --git a/manual/crypt.texi b/manual/crypt.texi
index 4882ee34e5..ce68f2853a 100644
--- a/manual/crypt.texi
+++ b/manual/crypt.texi
@@ -73,7 +73,7 @@ used by this function was added to the Linux kernel in version 3.17.)
The combination of @var{buffer} and @var{length} arguments specifies
an invalid memory range.
-@item EIO
+@item EINVAL
@var{length} is larger than 256, or the kernel entropy pool has
suffered a catastrophic failure.
@end table
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 1c80e497f0..831247d16a 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -284,6 +284,7 @@ tests := \
tst-environ-change-2 \
tst-environ-change-3 \
tst-environ-change-4 \
+ tst-getentropy \
tst-getenv-signal \
tst-getenv-static \
tst-getenv-thread \
@@ -401,6 +402,13 @@ tests += \
# tests
endif
+# Test for the getentropy symbol versions required for POSIX 2024
+ifeq ($(have-GLIBC_2.42)$(build-shared),yesyes)
+tests += \
+ tst-getentropy-compat \
+ # tests
+endif
+
LDLIBS-test-atexit-race = $(shared-thread-library)
LDLIBS-test-at_quick_exit-race = $(shared-thread-library)
LDLIBS-test-cxa_atexit-race = $(shared-thread-library)
diff --git a/stdlib/Versions b/stdlib/Versions
index 6d024000f8..66e61e1441 100644
--- a/stdlib/Versions
+++ b/stdlib/Versions
@@ -224,6 +224,7 @@ libc {
stdc_bit_ceil_ull;
}
GLIBC_2.42 {
+ getentropy;
uabs;
uimaxabs;
ulabs;
diff --git a/stdlib/getentropy.c b/stdlib/getentropy.c
index 5149fbdde0..dfc48168f1 100644
--- a/stdlib/getentropy.c
+++ b/stdlib/getentropy.c
@@ -16,16 +16,65 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#include <sys/random.h>
+#include <stdio.h>
#include <errno.h>
+#include <not-cancel.h>
+#include <sys/random.h>
+#include <shlib-compat.h>
/* Write LENGTH bytes of randomness starting at BUFFER. Return 0 on
success and -1 on failure. */
+static int
+getentropy_base (void *buffer, size_t length, int err)
+{
+ if (length > 256)
+ {
+ __set_errno (err);
+ return -1;
+ }
+
+ /* Try to fill the buffer completely. Even with the 256 byte limit
+ above, we might still receive an EINTR error (when blocking
+ during boot). */
+ void *end = buffer + length;
+ while (buffer < end)
+ {
+ /* NB: No cancellation point. */
+ ssize_t bytes = __getrandom_nocancel (buffer, end - buffer, 0);
+ if (bytes < 0)
+ {
+ if (errno == EINTR)
+ /* Try again if interrupted by a signal. */
+ continue;
+ else
+ return -1;
+ }
+ else if (bytes == 0)
+ /* No more bytes available. This should not happen under normal
+ circumstances. */
+ {
+ __set_errno (err);
+ return -1;
+ }
+
+ /* Try again in case of a short read. */
+ buffer += bytes;
+ }
+ return 0;
+}
+
int
-getentropy (void *buffer, size_t length)
+__new_getentropy (void *buffer, size_t length)
{
- __set_errno (ENOSYS);
- return -1;
+ return getentropy_base (buffer, length, EINVAL);
}
+versioned_symbol (libc, __new_getentropy, getentropy, GLIBC_2_42);
-stub_warning (getentropy)
+#if SHLIB_COMPAT (libc, GLIBC_2_25, GLIBC_2_42)
+int
+__old_getentropy (void *buffer, size_t length)
+{
+ return getentropy_base (buffer, length, EIO);
+}
+compat_symbol (libc, __old_getentropy, getentropy, GLIBC_2_25);
+#endif
diff --git a/stdlib/tst-getentropy-compat.c b/stdlib/tst-getentropy-compat.c
new file mode 100644
index 0000000000..388edda7e0
--- /dev/null
+++ b/stdlib/tst-getentropy-compat.c
@@ -0,0 +1,26 @@
+/* Compat tests for the getentropy function.
+ Copyright (C) 2016-2025 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <sys/random.h>
+
+#include <shlib-compat.h>
+
+compat_symbol_reference (libc, getentropy, getentropy, GLIBC_2_25);
+
+#define ERRNO_BUFFER_TO_LARGE EIO
+#include "tst-getentropy.c"
diff --git a/stdlib/tst-getentropy.c b/stdlib/tst-getentropy.c
new file mode 100644
index 0000000000..eef57fca2c
--- /dev/null
+++ b/stdlib/tst-getentropy.c
@@ -0,0 +1,108 @@
+/* Tests for the getentropy function.
+ Copyright (C) 2016-2025 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/random.h>
+
+#ifndef ERRNO_BUFFER_TO_LARGE
+# define ERRNO_BUFFER_TO_LARGE EINVAL
+#endif
+
+/* Set to true if any errors are encountered. */
+static bool errors;
+
+static void
+test_getentropy (void)
+{
+ char buf[16];
+ memset (buf, '@', sizeof (buf));
+ if (getentropy (buf, 0) != 0)
+ {
+ printf ("error: getentropy zero length: %m\n");
+ errors = true;
+ return;
+ }
+ for (size_t i = 0; i < sizeof (buf); ++i)
+ if (buf[i] != '@')
+ {
+ printf ("error: getentropy modified zero-length buffer\n");
+ errors = true;
+ return;
+ }
+
+ if (getentropy (buf, sizeof (buf)) != 0)
+ {
+ printf ("error: getentropy buf: %m\n");
+ errors = true;
+ return;
+ }
+
+ char buf2[256];
+ _Static_assert (sizeof (buf) < sizeof (buf2), "buf and buf2 compatible");
+ memset (buf2, '@', sizeof (buf2));
+ if (getentropy (buf2, sizeof (buf)) != 0)
+ {
+ printf ("error: getentropy buf2: %m\n");
+ errors = true;
+ return;
+ }
+
+ /* The probability that these two buffers are equal is very
+ small. */
+ if (memcmp (buf, buf2, sizeof (buf)) == 0)
+ {
+ printf ("error: getentropy appears to return constant bytes\n");
+ errors = true;
+ return;
+ }
+
+ for (size_t i = sizeof (buf); i < sizeof (buf2); ++i)
+ if (buf2[i] != '@')
+ {
+ printf ("error: getentropy wrote beyond the end of the buffer\n");
+ errors = true;
+ return;
+ }
+
+ char buf3[257];
+ if (getentropy (buf3, sizeof (buf3)) == 0)
+ {
+ printf ("error: getentropy successful for 257 byte buffer\n");
+ errors = true;
+ return;
+ }
+ if (errno != ERRNO_BUFFER_TO_LARGE)
+ {
+ printf ("error: getentropy wrong error for 257 byte buffer: %m\n");
+ errors = true;
+ return;
+ }
+}
+
+static int
+do_test (void)
+{
+ test_getentropy ();
+
+ return errors;
+}
+
+#include <support/test-driver.c>
diff --git a/stdlib/tst-getrandom.c b/stdlib/tst-getrandom.c
index 3b2153376b..e8b3392db5 100644
--- a/stdlib/tst-getrandom.c
+++ b/stdlib/tst-getrandom.c
@@ -1,4 +1,4 @@
-/* Tests for the getentropy, getrandom functions.
+/* Tests for the getrandom functions.
Copyright (C) 2016-2025 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -151,73 +151,6 @@ test_flags (unsigned int flags)
}
}
-static void
-test_getentropy (void)
-{
- char buf[16];
- memset (buf, '@', sizeof (buf));
- if (getentropy (buf, 0) != 0)
- {
- printf ("error: getentropy zero length: %m\n");
- errors = true;
- return;
- }
- for (size_t i = 0; i < sizeof (buf); ++i)
- if (buf[i] != '@')
- {
- printf ("error: getentropy modified zero-length buffer\n");
- errors = true;
- return;
- }
-
- if (getentropy (buf, sizeof (buf)) != 0)
- {
- printf ("error: getentropy buf: %m\n");
- errors = true;
- return;
- }
-
- char buf2[256];
- _Static_assert (sizeof (buf) < sizeof (buf2), "buf and buf2 compatible");
- memset (buf2, '@', sizeof (buf2));
- if (getentropy (buf2, sizeof (buf)) != 0)
- {
- printf ("error: getentropy buf2: %m\n");
- errors = true;
- return;
- }
-
- /* The probability that these two buffers are equal is very
- small. */
- if (memcmp (buf, buf2, sizeof (buf)) == 0)
- {
- printf ("error: getentropy appears to return constant bytes\n");
- errors = true;
- return;
- }
-
- for (size_t i = sizeof (buf); i < sizeof (buf2); ++i)
- if (buf2[i] != '@')
- {
- printf ("error: getentropy wrote beyond the end of the buffer\n");
- errors = true;
- return;
- }
-
- char buf3[257];
- if (getentropy (buf3, sizeof (buf3)) == 0)
- {
- printf ("error: getentropy successful for 257 byte buffer\n");
- errors = true;
- return;
- }
- if (errno != EIO)
- {
- printf ("error: getentropy wrong error for 257 byte buffer: %m\n");
- errors = true;
- return;
- }
-}
static int
do_test (void)
@@ -237,8 +170,6 @@ do_test (void)
test_flags (flags);
}
- test_getentropy ();
-
return errors;
}
diff --git a/sysdeps/mach/hurd/getentropy.c b/sysdeps/mach/hurd/getentropy.c
deleted file mode 100644
index 6ad8acc773..0000000000
--- a/sysdeps/mach/hurd/getentropy.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Implementation of getentropy based on getrandom.
- Copyright (C) 2016-2025 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#include <sys/random.h>
-#include <assert.h>
-#include <errno.h>
-#include <unistd.h>
-#include <hurd.h>
-
-/* Write LENGTH bytes of randomness starting at BUFFER. Return 0 on
- success and -1 on failure. */
-int
-getentropy (void *buffer, size_t length)
-{
- /* The interface is documented to return EIO for buffer lengths
- longer than 256 bytes. */
- if (length > 256)
- return __hurd_fail (EIO);
-
- /* Try to fill the buffer completely. Even with the 256 byte limit
- above, we might still receive an EINTR error (when blocking
- during boot). */
- void *end = buffer + length;
- while (buffer < end)
- {
- /* NB: No cancellation point. */
- ssize_t bytes = __getrandom (buffer, end - buffer, 0);
- if (bytes < 0)
- {
- if (errno == EINTR)
- /* Try again if interrupted by a signal. */
- continue;
- else
- return -1;
- }
- if (bytes == 0)
- /* No more bytes available. This should not happen under
- normal circumstances. */
- return __hurd_fail (EIO);
- /* Try again in case of a short read. */
- buffer += bytes;
- }
- return 0;
-}
diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
index a0e686afc7..c4d7a362ff 100644
--- a/sysdeps/mach/hurd/i386/libc.abilist
+++ b/sysdeps/mach/hurd/i386/libc.abilist
@@ -691,7 +691,7 @@ GLIBC_2.2.6 _libc_intl_domainname D 0x5
GLIBC_2.2.6 _longjmp F
GLIBC_2.2.6 _mcleanup F
GLIBC_2.2.6 _mcount F
-GLIBC_2.2.6 _nl_default_dirname D 0xe
+GLIBC_2.2.6 _nl_default_dirname D 0x12
GLIBC_2.2.6 _nl_domain_bindings D 0x4
GLIBC_2.2.6 _nl_msg_cat_cntr D 0x4
GLIBC_2.2.6 _null_auth D 0xc
@@ -2596,6 +2596,7 @@ GLIBC_2.42 cfgetobaud F
GLIBC_2.42 cfsetbaud F
GLIBC_2.42 cfsetibaud F
GLIBC_2.42 cfsetobaud F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_barrier_destroy F
GLIBC_2.42 pthread_barrier_init F
GLIBC_2.42 pthread_barrier_wait F
diff --git a/sysdeps/mach/hurd/x86_64/libc.abilist b/sysdeps/mach/hurd/x86_64/libc.abilist
index 8f9d6aa842..74d0abae04 100644
--- a/sysdeps/mach/hurd/x86_64/libc.abilist
+++ b/sysdeps/mach/hurd/x86_64/libc.abilist
@@ -2279,6 +2279,7 @@ GLIBC_2.42 cfgetobaud F
GLIBC_2.42 cfsetbaud F
GLIBC_2.42 cfsetibaud F
GLIBC_2.42 cfsetobaud F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_barrier_destroy F
GLIBC_2.42 pthread_barrier_init F
GLIBC_2.42 pthread_barrier_wait F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index a22e651432..537d73651d 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -2762,6 +2762,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index 4b5736a3b6..3ce173bf6c 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -3109,6 +3109,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
index b8a44784bd..dd9bb7b643 100644
--- a/sysdeps/unix/sysv/linux/arc/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
@@ -2523,6 +2523,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
index 959e44672f..82b837c530 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
@@ -2815,6 +2815,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
index a930d1a52b..d27c11ce96 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
@@ -2812,6 +2812,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
index 6325fc12c4..17741a5d04 100644
--- a/sysdeps/unix/sysv/linux/csky/libc.abilist
+++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
@@ -2799,6 +2799,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/getentropy.c b/sysdeps/unix/sysv/linux/getentropy.c
deleted file mode 100644
index a62c9fb099..0000000000
--- a/sysdeps/unix/sysv/linux/getentropy.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Implementation of getentropy based on the getrandom system call.
- Copyright (C) 2016-2025 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#include <sys/random.h>
-#include <assert.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sysdep.h>
-
-/* Write LENGTH bytes of randomness starting at BUFFER. Return 0 on
- success and -1 on failure. */
-int
-getentropy (void *buffer, size_t length)
-{
- /* The interface is documented to return EIO for buffer lengths
- longer than 256 bytes. */
- if (length > 256)
- {
- __set_errno (EIO);
- return -1;
- }
-
- /* Try to fill the buffer completely. Even with the 256 byte limit
- above, we might still receive an EINTR error (when blocking
- during boot). */
- void *end = buffer + length;
- while (buffer < end)
- {
- /* NB: No cancellation point. */
- ssize_t bytes = INLINE_SYSCALL_CALL (getrandom, buffer, end - buffer, 0);
- if (bytes < 0)
- {
- if (errno == EINTR)
- /* Try again if interrupted by a signal. */
- continue;
- else
- return -1;
- }
- if (bytes == 0)
- {
- /* No more bytes available. This should not happen under
- normal circumstances. */
- __set_errno (EIO);
- return -1;
- }
- /* Try again in case of a short read. */
- buffer += bytes;
- }
- return 0;
-}
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index 86b3fbdeec..e9470e2f90 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -2836,6 +2836,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index 6555592d86..a697aeb59b 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -3019,6 +3019,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
index a6cab9612a..a957672bfb 100644
--- a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
@@ -2283,6 +2283,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index 7b7b72aa50..ad1691b238 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -2795,6 +2795,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index df398e43c6..d4b18b7566 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -2962,6 +2962,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
index ca8df6f4b0..5e8d41d6e7 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
@@ -2848,6 +2848,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
index 9508154847..a1fe19d48c 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
@@ -2845,6 +2845,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index 4d51cc428f..b01f996dc1 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -2923,6 +2923,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 tcgetattr F
GLIBC_2.42 tcsetattr F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index fc366d1bd0..ff3cfe93de 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -2929,6 +2929,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 tcgetattr F
GLIBC_2.42 tcsetattr F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
index debd5c37c9..8967754bbe 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -2831,6 +2831,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 tcgetattr F
GLIBC_2.42 tcsetattr F
diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist
index b62d59f1af..2c6e5dd58c 100644
--- a/sysdeps/unix/sysv/linux/or1k/libc.abilist
+++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist
@@ -2273,6 +2273,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index 883e66f3ae..ac69ec6019 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -3152,6 +3152,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index 84cd9e0e18..d5ce994fc5 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -3197,6 +3197,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
index 8832568ab3..ae22201755 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
@@ -2906,6 +2906,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
index b6ff8016e4..fb580580cf 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
@@ -2982,6 +2982,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
index 1771a2370c..d339b68c85 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
@@ -2526,6 +2526,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
index 4b48352fd9..917f61e4d7 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
@@ -2726,6 +2726,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index f0decc787b..bc8a541fb8 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -3150,6 +3150,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
index da8a2bfb74..0b2bdff6eb 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -2943,6 +2943,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
index fb30341894..8137bcde8e 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
@@ -2842,6 +2842,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
index d716673432..dd83030858 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
@@ -2839,6 +2839,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index 6deedf216d..10191fa40e 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -3171,6 +3171,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 tcgetattr F
GLIBC_2.42 tcsetattr F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
index 1ce22bf036..b895aa33f3 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -2807,6 +2807,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 tcgetattr F
GLIBC_2.42 tcsetattr F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index 564877250b..f42fbbf77c 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -2758,6 +2758,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
index 25a39d0943..82ac039f47 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -2777,6 +2777,7 @@ GLIBC_2.42 cfsetispeed F
GLIBC_2.42 cfsetobaud F
GLIBC_2.42 cfsetospeed F
GLIBC_2.42 cfsetspeed F
+GLIBC_2.42 getentropy F
GLIBC_2.42 pthread_gettid_np F
GLIBC_2.42 uabs F
GLIBC_2.42 uimaxabs F
--
2.43.0
More information about the Libc-alpha
mailing list