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 | ||
