From 0e8c949786539375ccb6ebe4af968c7cf5cebe43 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Tue, 25 Mar 2014 00:41:43 +1100 Subject: [PATCH] rand: bubble up IO errors when creating an OSRng. --- src/librand/isaac.rs | 14 ++++++++++---- src/librand/lib.rs | 5 ++++- src/librand/os.rs | 17 +++++++++-------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/librand/isaac.rs b/src/librand/isaac.rs index d0dc5b90867f..5021675c2d81 100644 --- a/src/librand/isaac.rs +++ b/src/librand/isaac.rs @@ -46,12 +46,15 @@ impl IsaacRng { /// Create an ISAAC random number generator with a random seed. pub fn new() -> IsaacRng { let mut rng = EMPTY; - + let mut os_rng = match OSRng::new() { + Ok(r) => r, + Err(e) => fail!("IsaacRng::new: creating OSRng failed: {}", e) + }; unsafe { let ptr = rng.rsl.as_mut_ptr(); raw::mut_buf_as_slice(ptr as *mut u8, mem::size_of_val(&rng.rsl), |slice| { - OSRng::new().fill_bytes(slice); + os_rng.fill_bytes(slice); }) } @@ -251,12 +254,15 @@ impl Isaac64Rng { /// seed. pub fn new() -> Isaac64Rng { let mut rng = EMPTY_64; - + let mut os_rng = match OSRng::new() { + Ok(r) => r, + Err(e) => fail!("Isaac64Rng::new: creating OSRng failed: {}", e) + }; unsafe { let ptr = rng.rsl.as_mut_ptr(); raw::mut_buf_as_slice(ptr as *mut u8, mem::size_of_val(&rng.rsl), |slice| { - OSRng::new().fill_bytes(slice); + os_rng.fill_bytes(slice); }) } diff --git a/src/librand/lib.rs b/src/librand/lib.rs index e405ace38670..438075998f7e 100644 --- a/src/librand/lib.rs +++ b/src/librand/lib.rs @@ -540,7 +540,10 @@ impl XorShiftRng { pub fn new() -> XorShiftRng { let mut s = [0u8, ..16]; loop { - let mut r = OSRng::new(); + let mut r = match OSRng::new() { + Ok(r) => r, + Err(e) => fail!("XorShiftRng::new: creating OSRng failed: {}", e) + }; r.fill_bytes(s); if !s.iter().all(|x| *x == 0) { diff --git a/src/librand/os.rs b/src/librand/os.rs index 0f4169bfe28c..396346b672f5 100644 --- a/src/librand/os.rs +++ b/src/librand/os.rs @@ -17,7 +17,7 @@ pub use self::imp::OSRng; mod imp { use Rng; use reader::ReaderRng; - use std::io::File; + use std::io::{IoResult, File}; /// A random number generator that retrieves randomness straight from /// the operating system. Platform sources: @@ -35,12 +35,11 @@ mod imp { impl OSRng { /// Create a new `OSRng`. - pub fn new() -> OSRng { - let reader = File::open(&Path::new("/dev/urandom")); - let reader = reader.ok().expect("Error opening /dev/urandom"); + pub fn new() -> IoResult { + let reader = try!(File::open(&Path::new("/dev/urandom"))); let reader_rng = ReaderRng::new(reader); - OSRng { inner: reader_rng } + Ok(OSRng { inner: reader_rng }) } } @@ -61,6 +60,7 @@ mod imp { mod imp { use Rng; use std::cast; + use std::io::{IoResult, IoError}; use std::libc::{c_ulong, DWORD, BYTE, LPCSTR, BOOL}; use std::os; use std::rt::stack; @@ -99,7 +99,7 @@ mod imp { impl OSRng { /// Create a new `OSRng`. - pub fn new() -> OSRng { + pub fn new() -> IoResult { let mut hcp = 0; let mut ret = unsafe { CryptAcquireContextA(&mut hcp, 0 as LPCSTR, 0 as LPCSTR, @@ -143,9 +143,10 @@ mod imp { } if ret == 0 { - fail!("couldn't create context: {}", os::last_os_error()); + Err(IoError::last_error()) + } else { + Ok(OSRng { hcryptprov: hcp }) } - OSRng { hcryptprov: hcp } } }