Skip to content

Commit a32be9f

Browse files
committed
Revise error logging; add EntropyRng test
1 parent cfd28c2 commit a32be9f

File tree

4 files changed

+27
-15
lines changed

4 files changed

+27
-15
lines changed

src/error.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,13 @@ impl fmt::Display for Error {
125125
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
126126
#[cfg(feature="std")] {
127127
if let Some(ref cause) = self.cause {
128-
return write!(f, "RNG error [{}]: {}; cause: {}",
129-
self.kind.description(),
128+
return write!(f, "{} ({}); cause: {}",
130129
self.msg(),
130+
self.kind.description(),
131131
cause);
132132
}
133133
}
134-
write!(f, "RNG error [{}]: {}", self.kind.description(), self.msg())
134+
write!(f, "{} ({})", self.msg(), self.kind.description())
135135
}
136136
}
137137

src/lib.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -950,8 +950,8 @@ thread_local!(
950950
static THREAD_RNG_KEY: Rc<RefCell<ReseedingRng<StdRng, EntropyRng>>> = {
951951
const THREAD_RNG_RESEED_THRESHOLD: u64 = 32_768;
952952
let mut entropy_source = EntropyRng::new();
953-
let r = StdRng::from_rng(&mut entropy_source)
954-
.expect("could not initialize thread_rng");
953+
let r = StdRng::from_rng(&mut entropy_source).unwrap_or_else(|err|
954+
panic!("could not initialize thread_rng: {}", err));
955955
let rng = ReseedingRng::new(r,
956956
THREAD_RNG_RESEED_THRESHOLD,
957957
entropy_source);
@@ -1041,7 +1041,8 @@ impl Rng for EntropyRng {
10411041
}
10421042

10431043
fn fill_bytes(&mut self, dest: &mut [u8]) {
1044-
self.try_fill_bytes(dest).unwrap();
1044+
self.try_fill_bytes(dest).unwrap_or_else(|err|
1045+
panic!("all entropy sources failed; first error: {}", err))
10451046
}
10461047

10471048
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> {
@@ -1065,13 +1066,15 @@ impl Rng for EntropyRng {
10651066
let os_rng_result = try_os_new(dest);
10661067
match os_rng_result {
10671068
Ok(os_rng) => {
1069+
debug!("EntropyRng: using OsRng");
10681070
switch_rng = Some(EntropySource::Os(os_rng));
10691071
}
10701072
Err(os_rng_error) => {
10711073
warn!("EntropyRng: OsRng failed [falling back to JitterRng]: {}",
10721074
os_rng_error);
10731075
match try_jitter_new(dest) {
10741076
Ok(jitter_rng) => {
1077+
debug!("EntropyRng: using JitterRng");
10751078
switch_rng = Some(EntropySource::Jitter(jitter_rng));
10761079
}
10771080
Err(_jitter_error) => {
@@ -1090,6 +1093,7 @@ impl Rng for EntropyRng {
10901093
os_rng_error);
10911094
match try_jitter_new(dest) {
10921095
Ok(jitter_rng) => {
1096+
debug!("EntropyRng: using JitterRng");
10931097
switch_rng = Some(EntropySource::Jitter(jitter_rng));
10941098
}
10951099
Err(_jitter_error) => {
@@ -1102,7 +1106,7 @@ impl Rng for EntropyRng {
11021106
}
11031107
EntropySource::Jitter(ref mut rng) => {
11041108
if let Ok(os_rng) = try_os_new(dest) {
1105-
info!("EntropyRng: OsRng available [switching back from JitterRng]");
1109+
debug!("EntropyRng: using OsRng");
11061110
switch_rng = Some(EntropySource::Os(os_rng));
11071111
} else {
11081112
return rng.try_fill_bytes(dest); // use JitterRng
@@ -1194,7 +1198,7 @@ pub fn sample<T, I, R>(rng: &mut R, iterable: I, amount: usize) -> Vec<T>
11941198
mod test {
11951199
use impls;
11961200
#[cfg(feature="std")]
1197-
use super::{random, thread_rng};
1201+
use super::{random, thread_rng, EntropyRng};
11981202
use super::{Rng, SeedableRng, StdRng};
11991203
#[cfg(feature="alloc")]
12001204
use alloc::boxed::Box;
@@ -1240,6 +1244,13 @@ mod test {
12401244
impls::fill_bytes_via_u64(self, dest)
12411245
}
12421246
}
1247+
1248+
#[test]
1249+
#[cfg(feature="std")]
1250+
fn test_entropy() {
1251+
let mut rng = EntropyRng::new();
1252+
rng.next_u32();
1253+
}
12431254

12441255
#[test]
12451256
fn test_fill_bytes_default() {

src/os.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,14 @@ impl Rng for OsRng {
7878
loop {
7979
if let Err(e) = self.try_fill_bytes(dest) {
8080
if err_count >= RETRY_LIMIT {
81-
error!("OsRng failed too many times; last error: {:?}", e);
82-
panic!("OsRng failed too many times; last error: {:?}", e);
81+
error!("OsRng failed too many times; last error: {}", e);
82+
panic!("OsRng failed too many times; last error: {}", e);
8383
}
8484

8585
match e.kind() {
8686
ErrorKind::Transient => {
8787
if !error_logged {
88-
warn!("OsRng failed; retrying up to {} times. Error: {:?}",
88+
warn!("OsRng failed; retrying up to {} times. Error: {}",
8989
TRANSIENT_RETRIES, e);
9090
error_logged = true;
9191
}
@@ -95,7 +95,7 @@ impl Rng for OsRng {
9595
}
9696
ErrorKind::NotReady => {
9797
if !error_logged {
98-
warn!("OsRng failed; waiting up to {}s and retrying. Error: {:?}",
98+
warn!("OsRng failed; waiting up to {}s and retrying. Error: {}",
9999
MAX_RETRY_PERIOD, e);
100100
error_logged = true;
101101
}
@@ -104,8 +104,8 @@ impl Rng for OsRng {
104104
continue;
105105
}
106106
_ => {
107-
error!("OsRng failed: {:?}", e);
108-
panic!("OsRng fatal error: {:?}", e);
107+
error!("OsRng failed: {}", e);
108+
panic!("OsRng fatal error: {}", e);
109109
}
110110
}
111111
}

src/reseeding.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ impl<R: Rng+SeedableRng, Rsdr: Rng> ReseedingRng<R, Rsdr> {
4646
pub fn reseed_if_necessary(&mut self) {
4747
if self.bytes_generated >= self.generation_threshold {
4848
trace!("Reseeding RNG after {} bytes", self.bytes_generated);
49-
R::from_rng(&mut self.reseeder).map(|result| self.rng = result).unwrap();
49+
R::from_rng(&mut self.reseeder).map(|result| self.rng = result)
50+
.unwrap_or_else(|err| panic!("reseeding failed: {}", err));
5051
self.bytes_generated = 0;
5152
}
5253
}

0 commit comments

Comments
 (0)