[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    [PATCH v3] seedrng: fix getrandom() detection for non-glibc libc
From:       Raphaël Mélotte <raphael.melotte () mind ! be>
Date:       2023-04-26 12:43:25
Message-ID: 20230426124325.1338854-1-raphael.melotte () mind ! be
[Download RAW message or body]

glibc <= 2.24 does not provide getrandom(). A check for it has been
added in 200a9669fbf6f06894e4243cccc9fc11a1a6073a and fixed in
cb57abb46f06f4ede8d9ccbdaac67377fdf416cf.

However, building with a libc other than glibc can lead to the same
problem as not every other libc has getrandom() either:

- uClibc provides it from v1.0.2 onwards, but requires to define
_GNU_SOURCE (all versions - we already define it by default), and
stddef to be included first (when using uClibc < 1.0.35 - we already
include it through libbb.h).

- musl libc has getrandom(), but only from version 1.1.20 onwards. As
musl does not provide __MUSL__ or version information, it's not
possible to check for it like we did for glibc.

All of this makes it difficult (or impossible in case of musl) to
check what we need to do to have getrandom() based on each libc
versions.

On top of that, getrandom() is also not available on older kernels. As
an example, when using a 3.10 kernel with uClibc 1.0.26, getrandom()
is declared so compiling works, but it fails at link time because
getrandom() is not defined.

To make it easier, take a similar approach to what was done for the
crypt library: try to build a sample program to see if we have
getrandom().

Based on the new Makefile variable, we now either use the
libc-provided getrandom() when it's available, or use our own
implementation when it's not (like it was the case already for glibc <
2.25).

This should fix compiling with many libc/kernel combinations.

Signed-off-by: Raphaël Mélotte <raphael.melotte@mind.be>
---
Changes v2 -> v3:
  - fix _GNU_SOURCE define location

Changes v1 -> v2:
  - move _GNU_SOURCE to bb_libtest.c
  - remove GRND_NONBLOCK

Note that I was not able to test every single combination, but I could
confirm it builds successfully for:
uClibc 10.0.24, linux headers 3.10 (libc getrandom NOT used)
uClibc 1.0.36, linux headers 4.9 (libc getrandom used)
musl 1.1.16, linux headers 4.12 (libc getrandom NOT used)
musl 1.2.1, linux headers (libc getrandom used)
glibc 2.25, linux headers 4.10 (libc getrandom used)

 Makefile.flags      | 7 +++++++
 miscutils/seedrng.c | 8 ++++----
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/Makefile.flags b/Makefile.flags
index 1cec5ba20..4ee12d2d9 100644
--- a/Makefile.flags
+++ b/Makefile.flags
@@ -161,6 +161,13 @@ ifeq ($(RT_AVAILABLE),y)
 LDLIBS += rt
 endif
 
+# Not all libc versions have getrandom, so check for it.
+HAVE_GETRANDOM := $(shell printf '#define _GNU_SOURCE\n#include <stddef.h>\n#include \
<sys/random.h>\nint main(void){char buf[256];\ngetrandom(buf,sizeof(buf),0);}' \
>bb_libtest.c; $(CC) $(CFLAGS) $(CFLAGS_busybox) -o /dev/null bb_libtest.c >/dev/null \
> 2>&1 && echo "y"; rm bb_libtest.c)
+
+ifeq ($(HAVE_GETRANDOM),y)
+CFLAGS += -DHAVE_GETRANDOM
+endif
+
 # libpam may use libpthread, libdl and/or libaudit.
 # On some platforms that requires an explicit -lpthread, -ldl, -laudit.
 # However, on *other platforms* it fails when some of those flags
diff --git a/miscutils/seedrng.c b/miscutils/seedrng.c
index 3bf6e2ea7..2f1e18c32 100644
--- a/miscutils/seedrng.c
+++ b/miscutils/seedrng.c
@@ -44,8 +44,10 @@
 #include <linux/random.h>
 #include <sys/file.h>
 
-/* Fix up glibc <= 2.24 not having getrandom() */
-#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ <= 24
+/* Fix up some libc (e.g. glibc <= 2.24) not having getrandom() */
+#if defined HAVE_GETRANDOM
+#include <sys/random.h>
+#else /* No getrandom */
 #include <sys/syscall.h>
 static ssize_t getrandom(void *buffer, size_t length, unsigned flags)
 {
@@ -56,8 +58,6 @@ static ssize_t getrandom(void *buffer, size_t length, unsigned \
flags)  return -1;
 # endif
 }
-#else
-#include <sys/random.h>
 #endif
 
 /* Apparently some headers don't ship with this yet. */
-- 
2.39.1

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic