summaryrefslogtreecommitdiff
path: root/arc4random.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2013-08-06 17:29:34 -0400
committerNick Mathewson <nickm@torproject.org>2013-08-06 17:29:34 -0400
commitf391b0030c9a3a62e5c4a4d00e35b7f9665db1a7 (patch)
tree4d0b70e3f93abafe6749abb378c50b72c7b88f5a /arc4random.c
parente639a9e10fe4555c035830ce171db9259bebddaf (diff)
parent2bbb5d7612d3f9f12acb02e15127e676ff35d669 (diff)
downloadlibevent-f391b0030c9a3a62e5c4a4d00e35b7f9665db1a7.tar.gz
Merge remote-tracking branch 'origin/patches-2.0'
Conflicts: arc4random.c
Diffstat (limited to 'arc4random.c')
-rw-r--r--arc4random.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/arc4random.c b/arc4random.c
index 8a6c3d24..016cae66 100644
--- a/arc4random.c
+++ b/arc4random.c
@@ -294,6 +294,27 @@ arc4_seed_proc_sys_kernel_random_uuid(void)
#ifndef _WIN32
#define TRY_SEED_URANDOM
+static char *arc4random_urandom_filename = NULL;
+
+static int arc4_seed_urandom_helper_(const char *fname)
+{
+ unsigned char buf[ADD_ENTROPY];
+ int fd;
+ size_t n;
+
+ fd = evutil_open_closeonexec_(fname, O_RDONLY, 0);
+ if (fd<0)
+ return -1;
+ n = read_all(fd, buf, sizeof(buf));
+ close(fd);
+ if (n != sizeof(buf))
+ return -1;
+ arc4_addrandom(buf, sizeof(buf));
+ memset(buf, 0, sizeof(buf));
+ arc4_seeded_ok = 1;
+ return 0;
+}
+
static int
arc4_seed_urandom(void)
{
@@ -301,22 +322,13 @@ arc4_seed_urandom(void)
static const char *filenames[] = {
"/dev/srandom", "/dev/urandom", "/dev/random", NULL
};
- unsigned char buf[ADD_ENTROPY];
- int fd, i;
- size_t n;
+ int i;
+ if (arc4random_urandom_filename)
+ return arc4_seed_urandom_helper_(arc4random_urandom_filename);
for (i = 0; filenames[i]; ++i) {
- fd = evutil_open_closeonexec_(filenames[i], O_RDONLY, 0);
- if (fd<0)
- continue;
- n = read_all(fd, buf, sizeof(buf));
- close(fd);
- if (n != sizeof(buf))
- return -1;
- arc4_addrandom(buf, sizeof(buf));
- memset(buf, 0, sizeof(buf));
- arc4_seeded_ok = 1;
- return 0;
+ if (arc4_seed_urandom_helper_(filenames[i]) == 0)
+ return 0;
}
return -1;