@@ -36,12 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3636#include < fcntl.h>
3737#include < signal.h>
3838#ifdef __linux__
39- #include < linux/version.h>
40- #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
41- #include < sys/syscall.h>
42- #include < linux/random.h>
43- #define HAS_GETRANDOM_SYSCALL 1
44- #endif
39+ #include < sys/random.h>
4540#endif
4641#ifdef __native_client__
4742#include < nacl/nacl_exception.h>
@@ -63,7 +58,7 @@ namespace Sys {
6358// TODO: also use in VMs when cvars can be observed from multiple modules
6459// This option can be turned on when debugging memory management
6560#ifdef BUILD_ENGINE
66- Cvar::Cvar<bool > pedanticShutdown (" common.pedanticShutdown" , " run useless shutdown procedures before exit" , Cvar::NONE,
61+ static Cvar::Cvar<bool > pedanticShutdown (" common.pedanticShutdown" , " run useless shutdown procedures before exit" , Cvar::NONE,
6762#ifdef USING_SANITIZER
6863 true );
6964#else
@@ -417,7 +412,7 @@ intptr_t DynamicLib::InternalLoadSym(Str::StringRef sym, std::string& errorStrin
417412#endif // __native_client__
418413
419414#ifdef BUILD_ENGINE
420- bool processTerminating = false ;
415+ static bool processTerminating = false ;
421416
422417void OSExit (int exitCode) {
423418 processTerminating = true ;
@@ -462,19 +457,32 @@ void GenRandomBytes(void* dest, size_t size)
462457 size_t bytes_written;
463458 if (nacl_secure_random (dest, size, &bytes_written) != 0 || bytes_written != size)
464459 Sys::Error (" nacl_secure_random failed" );
465- #elif defined(__linux__) && defined(HAS_GETRANDOM_SYSCALL)
466- if (syscall (SYS_getrandom, dest, size, GRND_NONBLOCK) == -1 )
467- Sys::Error (" Failed getrandom syscall: %s" , strerror (errno));
468460#elif defined(__linux__)
469- int fd = open (" /dev/urandom" , O_RDONLY);
470- if (fd == -1 )
471- Sys::Error (" Failed to open /dev/urandom: %s" , strerror (errno));
472- if (read (fd, dest, size) != (ssize_t ) size)
473- Sys::Error (" Failed to read from /dev/urandom: %s" , strerror (errno));
474- close (fd);
461+ ssize_t ret = getrandom (dest, size, GRND_NONBLOCK);
462+ if (ret == -1 )
463+ {
464+ if (errno == ENOSYS)
465+ {
466+ Log::Warn (" getrandom syscall is not supported" );
467+
468+ int fd = open (" /dev/urandom" , O_RDONLY);
469+ if (fd == -1 )
470+ Sys::Error (" Failed to open /dev/urandom: %s" , strerror (errno));
471+ if (read (fd, dest, size) != (ssize_t ) size)
472+ Sys::Error (" Failed to read from /dev/urandom: %s" , strerror (errno));
473+ close (fd);
474+ }
475+ else
476+ {
477+ Sys::Error (" getrandom syscall failed: %s" , strerror (errno));
478+ }
479+ }
480+ else if (static_cast <size_t >(ret) != size)
481+ {
482+ Sys::Error (" getrandom syscall returned insufficient data" );
483+ }
475484#else
476485 arc4random_buf (dest, size);
477-
478486#endif
479487}
480488
0 commit comments