~ chicken-core (chicken-5) 9aa95d87db87ec9e4b2b936ddccd7c9dc7dc326f


commit 9aa95d87db87ec9e4b2b936ddccd7c9dc7dc326f
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sun Nov 5 11:45:11 2017 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sun Nov 5 11:45:11 2017 +0100

    latch onto using /dev/urandom if syscall fails once

diff --git a/runtime.c b/runtime.c
index 93733761..7b7c3539 100644
--- a/runtime.c
+++ b/runtime.c
@@ -12582,12 +12582,19 @@ C_word C_random_bytes(C_word buf, C_word size)
 #ifdef __OpenBSD__
   arc4random_buf(C_data_pointer(buf), count);
 #elif defined(SYS_getrandom) && defined(__NR_getrandom)
+  static int use_urandom = 0;
+
+  if(use_urandom) return random_urandom(buf, count);
+
   while(count > 0) {
     /* GRND_NONBLOCK = 0x0001 */
     r = syscall(SYS_getrandom, C_data_pointer(buf) + off, count, 1);
 
     if(r == -1) {
-      if(errno == ENOSYS) return random_urandom(buf, count);
+      if(errno == ENOSYS) {
+        use_urandom = 1;
+        return random_urandom(buf, count);
+      }
       else if(errno != EINTR) return C_SCHEME_FALSE;
       else r = 0;
     }
Trap