~ chicken-core (chicken-5) a72111962e59c1e4d8403b7c93ee3d3379cf4f6e
commit a72111962e59c1e4d8403b7c93ee3d3379cf4f6e
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Nov 3 18:04:41 2017 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Fri Nov 3 18:04:41 2017 +0100
perform reading of random bytes inside runtime.c
diff --git a/extras.scm b/extras.scm
index f4cccce5..af39c2b2 100644
--- a/extras.scm
+++ b/extras.scm
@@ -685,16 +685,10 @@
(else (make-string (or size nstate)))))
(r (##core#inline "C_random_bytes" dest
(or size (##sys#size dest)))))
- (cond ((eq? -1 r)
- (##sys#error 'random-bytes "error while obtaining random bytes"))
- ((not r) ; no syscall or API function, read from /dev/urandom...
- (unless in
- (if (file-exists? "/dev/urandom")
- (set! in (open-input-file "/dev/urandom" #:binary))
- (##sys#error 'random-bytes "no entropy source available")))
- (read-string! nstate dest in)
- (unless (eq? buf dest)
- (##core#inline "C_string_to_bytevector" dest))))
- dest))))
+ (when (eq? -1 r)
+ (##sys#error 'random-bytes "unable to read random bytes"))
+ (unless (eq? buf dest)
+ (##core#inline "C_string_to_bytevector" dest))
+ dest))))
)
diff --git a/runtime.c b/runtime.c
index 63c0e070..b7c06c2a 100644
--- a/runtime.c
+++ b/runtime.c
@@ -12530,6 +12530,7 @@ C_i_pending_interrupt(C_word dummy)
#ifdef __linux__
# include <sys/syscall.h>
+# include <fcntl.h>
#elif defined(__OpenBSD__)
# include <sys/systm.h>
#endif
@@ -12558,7 +12559,22 @@ C_word C_random_bytes(C_word buf, C_word size)
if(!RtlGenRandom((PVOID)C_data_pointer(buf), (LONG)count))
r = -1;
#else
- return C_SCHEME_FALSE;
+ static int fd = 0;
+
+ if(fd == 0) {
+ fd = open("/dev/urandom", O_RDONLY);
+
+ if(fd == -1) {
+ fd = 0;
+ return C_fix(-1);
+ }
+ }
+
+ do {
+ r = read(fd, C_data_pointer(buf), count);
+ } while(r == -1 && errno == EINTR);
+
+ r = 0;
#endif
return C_fix(r);
}
Trap