From 2d25348f63691921d54e12ae938f185ac96e4cf6 Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Tue, 6 Aug 2019 19:32:22 +0100 Subject: [PATCH 1/2] Fix function signature and use a loop to ensure buffer is filled. --- std/os/windows.zig | 15 ++++++++++++--- std/os/windows/advapi32.zig | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/std/os/windows.zig b/std/os/windows.zig index ac76e8f58f6aeeaaa2d698bfc5b3198b2275e3ff..a8f5b546447a3456ab9998f3a558000d0820d668 100644 --- a/std/os/windows.zig +++ b/std/os/windows.zig @@ -138,10 +138,19 @@ pub const RtlGenRandomError = error{Unexpected}; /// https://github.com/rust-lang-nursery/rand/issues/111 /// https://bugzilla.mozilla.org/show_bug.cgi?id=504270 pub fn RtlGenRandom(output: []u8) RtlGenRandomError!void { - if (advapi32.RtlGenRandom(output.ptr, output.len) == 0) { - switch (kernel32.GetLastError()) { - else => |err| return unexpectedError(err), + var total_read: usize = 0; + var buff: []u8 = output[0..]; + const max_read_size: ULONG = ULONG(maxInt(ULONG)); + + while (total_read < output.len) { + const to_read: ULONG = @intCast(ULONG, math.min(buff.len, max_read_size)); + + if (advapi32.RtlGenRandom(buff.ptr, to_read) == 0) { + return unexpectedError(kernel32.GetLastError()); } + + total_read += @intCast(usize, to_read); + buff = buff[to_read..]; } } diff --git a/std/os/windows/advapi32.zig b/std/os/windows/advapi32.zig index 165a2c10a3219707424d68cfb16bbd4f59d88294..940f10994cb20a18267e0484803e9faaacd3c6a5 100644 --- a/std/os/windows/advapi32.zig +++ b/std/os/windows/advapi32.zig @@ -19,5 +19,5 @@ pub extern "advapi32" stdcallcc fn RegQueryValueExW( // RtlGenRandom is known as SystemFunction036 under advapi32 // http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694.aspx */ -pub extern "advapi32" stdcallcc fn SystemFunction036(output: [*]u8, length: usize) BOOL; +pub extern "advapi32" stdcallcc fn SystemFunction036(output: [*]u8, length: ULONG) BOOL; pub const RtlGenRandom = SystemFunction036; -- 2.54.0 From f2bef0447a523e6f21ab21e4845aa982a1332572 Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Wed, 7 Aug 2019 22:19:25 +0100 Subject: [PATCH 2/2] Remove unneeded casts. --- std/os/windows.zig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/std/os/windows.zig b/std/os/windows.zig index a8f5b546447a3456ab9998f3a558000d0820d668..4c6bfe70d500cffba5bf845fa728dc20ac8caa16 100644 --- a/std/os/windows.zig +++ b/std/os/windows.zig @@ -140,16 +140,16 @@ pub const RtlGenRandomError = error{Unexpected}; pub fn RtlGenRandom(output: []u8) RtlGenRandomError!void { var total_read: usize = 0; var buff: []u8 = output[0..]; - const max_read_size: ULONG = ULONG(maxInt(ULONG)); + const max_read_size: ULONG = maxInt(ULONG); while (total_read < output.len) { - const to_read: ULONG = @intCast(ULONG, math.min(buff.len, max_read_size)); + const to_read: ULONG = math.min(buff.len, max_read_size); if (advapi32.RtlGenRandom(buff.ptr, to_read) == 0) { return unexpectedError(kernel32.GetLastError()); } - total_read += @intCast(usize, to_read); + total_read += to_read; buff = buff[to_read..]; } } -- 2.54.0