diff --git a/kitty/cross-platform-random.h b/kitty/cross-platform-random.h index c877c57bd..62d0e3993 100644 --- a/kitty/cross-platform-random.h +++ b/kitty/cross-platform-random.h @@ -9,8 +9,9 @@ #include #if __linux__ -#include #include +#if __has_include() +#include static inline bool secure_random_bytes(void *buf, size_t nbytes) { @@ -27,6 +28,25 @@ secure_random_bytes(void *buf, size_t nbytes) { } } #else +#include "safe-wrappers.h" +static inline bool +secure_random_bytes(void *buf, size_t nbytes) { + int fd = safe_open("/dev/urandom", O_RDONLY, 0); + if (fd < 0) return false; + size_t bytes_read = 0; + while (bytes_read < nbytes) { + ssize_t n = read(fd, (uint8_t*)buf + bytes_read, nbytes - bytes_read); + if (n < 0) { + if (errno == EINTR) continue; + break; + } + bytes_read += n; + } + safe_close(fd, __FILE__, __LINE__); + return bytes_read == nbytes; +} +#endif +#else static inline bool secure_random_bytes(void *buf, size_t nbytes) { arc4random_buf(buf, nbytes);