From 5cf24dab9e1d478f795da255d758e886f1129f05 Mon Sep 17 00:00:00 2001 From: Benjamin Drung Date: Tue, 4 Oct 2022 12:13:06 +0200 Subject: [PATCH] Keep evutil_secure_rng_add_bytes glibc 2.36 on Linux defines `arc4random` and `arc4random_buf` but not `arc4random_addrandom`. This leads to `evutil_secure_rng_add_bytes` not being defined. Use `arc4random_addrandom` from `arc4random.c` in case it is not defined. Bug: https://launchpad.net/bugs/1990941 Signed-off-by: Benjamin Drung --- arc4random.c | 2 ++ evutil_rand.c | 26 +++++++++++++++++++++++--- include/event2/util.h | 2 -- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/arc4random.c b/arc4random.c index c9533b17..7b486d65 100644 --- a/arc4random.c +++ b/arc4random.c @@ -471,6 +471,7 @@ arc4random(void) } #endif +#ifndef ARC4RANDOM_NOBUF ARC4RANDOM_EXPORT void arc4random_buf(void *buf_, size_t n) { @@ -484,6 +485,7 @@ arc4random_buf(void *buf_, size_t n) } ARC4_UNLOCK_(); } +#endif #ifndef ARC4RANDOM_NOUNIFORM /* diff --git a/evutil_rand.c b/evutil_rand.c index 8e9afdaa..603d65ba 100644 --- a/evutil_rand.c +++ b/evutil_rand.c @@ -114,7 +114,29 @@ ev_arc4random_buf(void *buf, size_t n) #endif } -#else /* !EVENT__HAVE_ARC4RANDOM { */ +#if !defined(EVENT__HAVE_ARC4RANDOM_ADDRANDOM) + +#ifdef EVENT__ssize_t +#define ssize_t EVENT__ssize_t +#endif +#define ARC4RANDOM_EXPORT static +#define ARC4_LOCK_() EVLOCK_LOCK(arc4rand_lock, 0) +#define ARC4_UNLOCK_() EVLOCK_UNLOCK(arc4rand_lock, 0) +#ifndef EVENT__DISABLE_THREAD_SUPPORT +static void *arc4rand_lock; +#endif + +#define ARC4RANDOM_UINT32 ev_uint32_t +#define ARC4RANDOM_NOSTIR +#define ARC4RANDOM_NORANDOM +#define ARC4RANDOM_NOUNIFORM +#define ARC4RANDOM_NOBUF + +#include "./arc4random.c" + +#endif /* !EVENT__HAVE_ARC4RANDOM_ADDRANDOM */ + +#else /* !EVENT__HAVE_ARC4RANDON { */ #ifdef EVENT__ssize_t #define ssize_t EVENT__ssize_t @@ -190,14 +212,12 @@ evutil_secure_rng_get_bytes(void *buf, size_t n) ev_arc4random_buf(buf, n); } -#if !defined(EVENT__HAVE_ARC4RANDOM) || defined(EVENT__HAVE_ARC4RANDOM_ADDRANDOM) void evutil_secure_rng_add_bytes(const char *buf, size_t n) { arc4random_addrandom((unsigned char*)buf, n>(size_t)INT_MAX ? INT_MAX : (int)n); } -#endif void evutil_free_secure_rng_globals_(void) diff --git a/include/event2/util.h b/include/event2/util.h index 43955bf6..62f142c6 100644 --- a/include/event2/util.h +++ b/include/event2/util.h @@ -862,7 +862,6 @@ int evutil_secure_rng_init(void); EVENT2_EXPORT_SYMBOL int evutil_secure_rng_set_urandom_device_file(char *fname); -#if !defined(EVENT__HAVE_ARC4RANDOM) || defined(EVENT__HAVE_ARC4RANDOM_ADDRANDOM) /** Seed the random number generator with extra random bytes. You should almost never need to call this function; it should be @@ -879,7 +878,6 @@ int evutil_secure_rng_set_urandom_device_file(char *fname); */ EVENT2_EXPORT_SYMBOL void evutil_secure_rng_add_bytes(const char *dat, size_t datlen); -#endif #ifdef __cplusplus } -- 2.37.2