authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-02 04:16:24-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-05-02 04:16:24-04:00
log428065da30cd957cadd9d1f2428933bab9d17637
treebf71acec07fb123258f5913a706577479b7cf6eb
parent3dbe02e2d8cda1fe0072e71ae7630170c270419e
parent74ad31536051e68b4b9edf924662b34c30b09da7
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #5243 from niacat/kern-arand

Avoid reading from /dev/urandom on NetBSD

3 files changed, 13 insertions(+), 0 deletions(-)

lib/std/c/netbsd.zig+1
...@@ -9,6 +9,7 @@ pub const _errno = __errno;...@@ -9,6 +9,7 @@ pub const _errno = __errno;
9pub const dl_iterate_phdr_callback = extern fn (info: *dl_phdr_info, size: usize, data: ?*c_void) c_int;9pub const dl_iterate_phdr_callback = extern fn (info: *dl_phdr_info, size: usize, data: ?*c_void) c_int;
10pub extern "c" fn dl_iterate_phdr(callback: dl_iterate_phdr_callback, data: ?*c_void) c_int;10pub extern "c" fn dl_iterate_phdr(callback: dl_iterate_phdr_callback, data: ?*c_void) c_int;
1111
12pub extern "c" fn arc4random_buf(buf: [*]u8, len: usize) void;
12pub extern "c" fn __fstat50(fd: fd_t, buf: *Stat) c_int;13pub extern "c" fn __fstat50(fd: fd_t, buf: *Stat) c_int;
13pub extern "c" fn __stat50(path: [*:0]const u8, buf: *Stat) c_int;14pub extern "c" fn __stat50(path: [*:0]const u8, buf: *Stat) c_int;
14pub extern "c" fn __clock_gettime50(clk_id: c_int, tp: *timespec) c_int;15pub extern "c" fn __clock_gettime50(clk_id: c_int, tp: *timespec) c_int;
lib/std/os.zig+4
...@@ -153,6 +153,10 @@ pub fn getrandom(buffer: []u8) GetRandomError!void {...@@ -153,6 +153,10 @@ pub fn getrandom(buffer: []u8) GetRandomError!void {
153 }153 }
154 return;154 return;
155 }155 }
156 if (builtin.os.tag == .netbsd) {
157 netbsd.arc4random_buf(buffer.ptr, buffer.len);
158 return;
159 }
156 if (builtin.os.tag == .wasi) {160 if (builtin.os.tag == .wasi) {
157 switch (wasi.random_get(buffer.ptr, buffer.len)) {161 switch (wasi.random_get(buffer.ptr, buffer.len)) {
158 0 => return,162 0 => return,
src/os.cpp+8
...@@ -1462,6 +1462,14 @@ static void init_rand() {...@@ -1462,6 +1462,14 @@ static void init_rand() {
1462 unsigned seed;1462 unsigned seed;
1463 memcpy(&seed, ptr_random, sizeof(seed));1463 memcpy(&seed, ptr_random, sizeof(seed));
1464 srand(seed);1464 srand(seed);
1465#elif defined(ZIG_OS_FREEBSD) || defined(ZIG_OS_NETBSD)
1466 unsigned seed;
1467 size_t len = sizeof(seed);
1468 int mib[2] = { CTL_KERN, KERN_ARND };
1469 if (sysctl(mib, 2, &seed, &len, NULL, 0) != 0) {
1470 zig_panic("unable to query random data from sysctl");
1471 }
1472 srand(seed);
1465#else1473#else
1466 int fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC);1474 int fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC);
1467 if (fd == -1) {1475 if (fd == -1) {