diff options
| author | bors <bors@rust-lang.org> | 2016-11-05 22:34:25 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-11-05 22:34:25 -0700 |
| commit | 3fc8304fd92720c688f3d6ac30b3a728d15f7a33 (patch) | |
| tree | 0ca0e95b5fee227e04f04bfaa4443bdd4a3ae3e4 /src/libstd/sys | |
| parent | cae6ab1c458ade22b4c228fcd4195917c96e2465 (diff) | |
| parent | bdacb63f5a93b7359e2d2b6d877f2841032d2ed2 (diff) | |
| download | rust-3fc8304fd92720c688f3d6ac30b3a728d15f7a33.tar.gz rust-3fc8304fd92720c688f3d6ac30b3a728d15f7a33.zip | |
Auto merge of #37597 - alexcrichton:rollup, r=alexcrichton
Rollup of 24 pull requests - Successful merges: #37255, #37317, #37408, #37410, #37422, #37427, #37470, #37501, #37537, #37556, #37557, #37564, #37565, #37566, #37569, #37574, #37577, #37579, #37583, #37585, #37586, #37587, #37589, #37596 - Failed merges: #37521, #37547
Diffstat (limited to 'src/libstd/sys')
| -rw-r--r-- | src/libstd/sys/unix/rand.rs | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/src/libstd/sys/unix/rand.rs b/src/libstd/sys/unix/rand.rs index 3aebb8c18ec..9b1cf6ffd0e 100644 --- a/src/libstd/sys/unix/rand.rs +++ b/src/libstd/sys/unix/rand.rs @@ -350,11 +350,19 @@ mod imp { #[link(name = "magenta")] extern { - fn mx_cprng_draw(buffer: *mut u8, len: usize) -> isize; + fn mx_cprng_draw(buffer: *mut u8, len: usize, actual: *mut usize) -> i32; } - fn getrandom(buf: &mut [u8]) -> isize { - unsafe { mx_cprng_draw(buf.as_mut_ptr(), buf.len()) } + fn getrandom(buf: &mut [u8]) -> Result<usize, i32> { + unsafe { + let mut actual = 0; + let status = mx_cprng_draw(buf.as_mut_ptr(), buf.len(), &mut actual); + if status == 0 { + Ok(actual) + } else { + Err(status) + } + } } pub struct OsRng { @@ -381,12 +389,16 @@ mod imp { let mut buf = v; while !buf.is_empty() { let ret = getrandom(buf); - if ret < 0 { - panic!("kernel mx_cprng_draw call failed! (returned {}, buf.len() {})", - ret, buf.len()); + match ret { + Err(err) => { + panic!("kernel mx_cprng_draw call failed! (returned {}, buf.len() {})", + err, buf.len()) + } + Ok(actual) => { + let move_buf = buf; + buf = &mut move_buf[(actual as usize)..]; + } } - let move_buf = buf; - buf = &mut move_buf[(ret as usize)..]; } } } |
