From e427f53b8fa4ddb43d9f21828aa56680348d3dae Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 9 Jul 2021 08:18:57 +0200 Subject: [PATCH] glib-aux: add getrandom() syscall wrapper as fallback We make an effort to get a better fallback case with _bad_random_bytes(). Also make an effort to get good randomness in the first place. Even if we compile against libc headers that don't provide getrandom(). Also, this isn't really ugly, because for a long time glibc was reluctant to add getrandom() wrapper and using syscall() was the way to go. (cherry picked from commit 05a6936befed8806d42a988b777d3013f15f6683) --- src/libnm-glib-aux/nm-random-utils.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/libnm-glib-aux/nm-random-utils.c b/src/libnm-glib-aux/nm-random-utils.c index aaeec62cc1..e8fc47e109 100644 --- a/src/libnm-glib-aux/nm-random-utils.c +++ b/src/libnm-glib-aux/nm-random-utils.c @@ -9,6 +9,7 @@ #include #include +#include #if USE_SYS_RANDOM_H #include @@ -21,6 +22,26 @@ /*****************************************************************************/ +#if !defined(SYS_getrandom) && defined(__NR_getrandom) + #define SYS_getrandom __NR_getrandom +#endif + +#ifndef GRND_NONBLOCK + #define GRND_NONBLOCK 0x01 +#endif + +#if !HAVE_GETRANDOM && defined(SYS_getrandom) +static int +getrandom(void *buf, size_t buflen, unsigned flags) +{ + return syscall(SYS_getrandom, buf, buflen, flags); +} + #undef HAVE_GETRANDOM + #define HAVE_GETRANDOM 1 +#endif + +/*****************************************************************************/ + #define STATIC_SALT "l6z5vMBldDlCD6na" typedef struct _nm_packed {