about summary refs log tree commit diff
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2014-03-25 00:41:43 +1100
committerHuon Wilson <dbau.pp+github@gmail.com>2014-04-01 20:46:09 +1100
commit0e8c949786539375ccb6ebe4af968c7cf5cebe43 (patch)
tree12f9528c73f1104bc37f202bf69e969ba7038307
parent119289b0f2359472ff07b4fac14188c3dc37b63c (diff)
downloadrust-0e8c949786539375ccb6ebe4af968c7cf5cebe43.tar.gz
rust-0e8c949786539375ccb6ebe4af968c7cf5cebe43.zip
rand: bubble up IO errors when creating an OSRng.
-rw-r--r--src/librand/isaac.rs14
-rw-r--r--src/librand/lib.rs5
-rw-r--r--src/librand/os.rs17
3 files changed, 23 insertions, 13 deletions
diff --git a/src/librand/isaac.rs b/src/librand/isaac.rs
index d0dc5b90867..5021675c2d8 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 e405ace3867..438075998f7 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 0f4169bfe28..396346b672f 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<OSRng> {
+            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<OSRng> {
             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 }
         }
     }