[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