authorgravatar for euantorano@gmail.comEuan Torano <euantorano@gmail.com> 2019-08-06 19:32:22+01:00
committergravatar for euantorano@gmail.comEuan Torano <euantorano@gmail.com> 2019-08-06 19:32:22+01:00
log2d25348f63691921d54e12ae938f185ac96e4cf6
tree1f8b32af44c4d8dfa1ae2526254e54f52ed67f06
parent7f23dac6dce2ce897295e8186f164f695cacdbc9
signaturelock-open Commit is signed but in an unrecognized format.

Fix function signature and use a loop to ensure buffer is filled.


2 files changed, 13 insertions(+), 4 deletions(-)

std/os/windows.zig+12-3
......@@ -138,10 +138,19 @@ pub const RtlGenRandomError = error{Unexpected};
138138/// https://github.com/rust-lang-nursery/rand/issues/111
139139/// https://bugzilla.mozilla.org/show_bug.cgi?id=504270
140140pub fn RtlGenRandom(output: []u8) RtlGenRandomError!void {
141 if (advapi32.RtlGenRandom(output.ptr, output.len) == 0) {
142 switch (kernel32.GetLastError()) {
143 else => |err| return unexpectedError(err),
141 var total_read: usize = 0;
142 var buff: []u8 = output[0..];
143 const max_read_size: ULONG = ULONG(maxInt(ULONG));
144
145 while (total_read < output.len) {
146 const to_read: ULONG = @intCast(ULONG, math.min(buff.len, max_read_size));
147
148 if (advapi32.RtlGenRandom(buff.ptr, to_read) == 0) {
149 return unexpectedError(kernel32.GetLastError());
144150 }
151
152 total_read += @intCast(usize, to_read);
153 buff = buff[to_read..];
145154 }
146155}
147156
std/os/windows/advapi32.zig+1-1
......@@ -19,5 +19,5 @@ pub extern "advapi32" stdcallcc fn RegQueryValueExW(
1919
2020// RtlGenRandom is known as SystemFunction036 under advapi32
2121// http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694.aspx */
22pub extern "advapi32" stdcallcc fn SystemFunction036(output: [*]u8, length: usize) BOOL;
22pub extern "advapi32" stdcallcc fn SystemFunction036(output: [*]u8, length: ULONG) BOOL;
2323pub const RtlGenRandom = SystemFunction036;