diff options
author | Thijs Schreijer <thijs@thijsschreijer.nl> | 2025-03-12 14:47:36 +0100 |
---|---|---|
committer | Thijs Schreijer <thijs@thijsschreijer.nl> | 2025-03-12 16:07:24 +0100 |
commit | ea7065b1f2d20c6126e18d50db586c66a8302139 (patch) | |
tree | 045f2502e475e685264fdf09ec51ff296a57609c /src | |
parent | 23a9b345172da87e701a1569547cea0767ea9d93 (diff) | |
download | luasystem-ea7065b1f2d20c6126e18d50db586c66a8302139.tar.gz luasystem-ea7065b1f2d20c6126e18d50db586c66a8302139.tar.bz2 luasystem-ea7065b1f2d20c6126e18d50db586c66a8302139.zip |
fix(random): on old glibc < 2.25, falback to /dev/urandom
Diffstat (limited to 'src')
-rw-r--r-- | src/random.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/random.c b/src/random.c index 7bffe30..5a07e0d 100644 --- a/src/random.c +++ b/src/random.c | |||
@@ -17,7 +17,12 @@ | |||
17 | #include <unistd.h> | 17 | #include <unistd.h> |
18 | #include <string.h> | 18 | #include <string.h> |
19 | #if defined(__linux__) | 19 | #if defined(__linux__) |
20 | #include <sys/random.h> // getrandom() | 20 | // getrandom() requires random.h and is available from glibc 2.25 |
21 | #if !defined(__GLIBC__) || (__GLIBC__ < 2 || __GLIBC_MINOR__ < 25) | ||
22 | #define USE_DEV_URANDOM 1 | ||
23 | #else | ||
24 | #include <sys/random.h> // getrandom() | ||
25 | #endif | ||
21 | #elif defined(__APPLE__) || defined(__unix__) | 26 | #elif defined(__APPLE__) || defined(__unix__) |
22 | #include <stdlib.h> // arc4random_buf() | 27 | #include <stdlib.h> // arc4random_buf() |
23 | #endif | 28 | #endif |
@@ -67,8 +72,8 @@ static int lua_get_random_bytes(lua_State* L) { | |||
67 | return 2; | 72 | return 2; |
68 | } | 73 | } |
69 | 74 | ||
70 | #elif defined(__linux__) | 75 | #elif defined(__linux__) && !defined(USE_DEV_URANDOM) |
71 | // Use getrandom() on Linux (Kernel 3.17+, 2014) | 76 | // Use getrandom() on Linux |
72 | while (total_read < num_bytes) { | 77 | while (total_read < num_bytes) { |
73 | ssize_t n = getrandom(buffer + total_read, num_bytes - total_read, 0); | 78 | ssize_t n = getrandom(buffer + total_read, num_bytes - total_read, 0); |
74 | if (n < 0) { | 79 | if (n < 0) { |
@@ -80,7 +85,7 @@ static int lua_get_random_bytes(lua_State* L) { | |||
80 | total_read += n; | 85 | total_read += n; |
81 | } | 86 | } |
82 | 87 | ||
83 | #elif defined(__APPLE__) || defined(__unix__) | 88 | #elif defined(__APPLE__) || (defined(__unix__) && !defined(USE_DEV_URANDOM)) |
84 | // Use arc4random_buf() on BSD/macOS | 89 | // Use arc4random_buf() on BSD/macOS |
85 | arc4random_buf(buffer, num_bytes); | 90 | arc4random_buf(buffer, num_bytes); |
86 | 91 | ||