Skip to content

Commit 1411a1c

Browse files
committed
fix bugs
1 parent b677c59 commit 1411a1c

File tree

7 files changed

+50
-62
lines changed

7 files changed

+50
-62
lines changed

rand_chacha/src/chacha.rs

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#[cfg(not(feature = "std"))] use core;
1313
#[cfg(feature = "std")] use std as core;
1414

15-
use self::core::{fmt, slice};
15+
use self::core::fmt;
1616
use crate::guts::ChaCha;
1717
use rand_core::block::{BlockRng, BlockRngCore};
1818
use rand_core::{CryptoRng, Error, RngCore, SeedableRng};
@@ -29,29 +29,6 @@ const BLOCK_WORDS: u8 = 16;
2929
#[derive(Eq, PartialEq, Default, Clone, Copy, Debug)]
3030
pub struct Results([u64; 32]);
3131

32-
impl AsRef<[u8]> for Results {
33-
#[inline(always)]
34-
fn as_ref(&self) -> &[u8] {
35-
unsafe {
36-
slice::from_raw_parts(
37-
self.0.as_ptr() as *const u8,
38-
8 * self.0.len(),
39-
)
40-
}
41-
}
42-
}
43-
44-
impl AsRef<[u32]> for Results {
45-
#[inline(always)]
46-
fn as_ref(&self) -> &[u32] {
47-
unsafe {
48-
slice::from_raw_parts(
49-
self.0.as_ptr() as *const u32,
50-
2 * self.0.len(),
51-
)
52-
}
53-
}
54-
}
5532
impl AsRef<[u64]> for Results {
5633
#[inline(always)]
5734
fn as_ref(&self) -> &[u64] {

rand_core/src/block.rs

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,12 @@
3030
//! #[derive(Eq, PartialEq, Default)]
3131
//! pub struct Results([u64; 8]);
3232
//!
33-
//! // implement `AsRef<[u8]>`, `AsRef<[u32]>`, and `AsRef<[u64]>` for `Results`
33+
//! impl AsRef<[u64]> for Results {
34+
//! #[inline(always)]
35+
//! fn as_ref(&self) -> &[u64] {
36+
//! &self.0
37+
//! }
38+
//! }
3439
//!
3540
//! impl BlockRngCore for MyRngCore {
3641
//! type Results = Results;
@@ -60,7 +65,7 @@
6065
6166
use crate::{CryptoRng, Error, RngCore, SeedableRng};
6267
use core::convert::AsRef;
63-
use core::fmt;
68+
use core::{fmt, slice};
6469
#[cfg(feature = "serde1")]
6570
use serde::{Deserialize, Serialize};
6671

@@ -72,7 +77,7 @@ use serde::{Deserialize, Serialize};
7277
pub trait BlockRngCore {
7378
/// Results type. This is the 'block' an RNG implementing `BlockRngCore`
7479
/// generates, which will usually be an array like `[u8; 64]`.
75-
type Results: AsRef<[u8]> + AsRef<[u32]> + AsRef<[u64]> + Default + Sized;
80+
type Results: AsRef<[u64]> + Default + Sized;
7681

7782
/// Generate a new block of results.
7883
fn generate(&mut self, results: &mut Self::Results);
@@ -86,6 +91,7 @@ pub trait BlockRngCore {
8691
}
8792

8893
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
94+
#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
8995
enum IndexLevel {
9096
U1,
9197
U8,
@@ -180,29 +186,40 @@ impl<R: BlockRngCore> BlockRng<R> {
180186
#[inline]
181187
pub fn new(core: R) -> BlockRng<R> {
182188
let results = R::Results::default();
183-
let index = AsRef::<[u8]>::as_ref(&results).len();
189+
let index = 8*results.as_ref().len();
184190
BlockRng { core, results, index, level: IndexLevel::U8 }
185191
}
186192

193+
#[inline(always)]
194+
fn results_to_u8(results: &R::Results) -> &[u8] {
195+
let buf = results.as_ref();
196+
unsafe {
197+
slice::from_raw_parts(buf.as_ptr() as *const u8, 8 * buf.len())
198+
}
199+
}
200+
187201
#[inline(always)]
188202
fn get_results_u8(&self) -> &[u8] {
189-
AsRef::<[u8]>::as_ref(&self.results)
203+
Self::results_to_u8(&self.results)
190204
}
191205

192206
#[inline(always)]
193207
fn get_results_u32(&self) -> &[u32] {
194-
AsRef::<[u32]>::as_ref(&self.results)
208+
let buf = self.results.as_ref();
209+
unsafe {
210+
slice::from_raw_parts(buf.as_ptr() as *const u32, 2 * buf.len())
211+
}
195212
}
196213

197214
#[inline(always)]
198215
fn get_results_u64(&self) -> &[u64] {
199-
AsRef::<[u64]>::as_ref(&self.results)
216+
self.results.as_ref()
200217
}
201218
}
202219

203220
impl<R: BlockRngCore> RngCore for BlockRng<R>
204221
where
205-
<R as BlockRngCore>::Results: AsRef<[u8]> + AsRef<[u32]> + AsRef<[u64]> + Default + Sized,
222+
<R as BlockRngCore>::Results: AsRef<[u64]> + Default + Sized,
206223
{
207224
#[inline]
208225
fn next_bool(&mut self) -> bool {
@@ -233,7 +250,7 @@ where
233250
self.index = 1;
234251
self.get_results_u32()[0]
235252
}
236-
}
253+
}.to_le()
237254
}
238255

239256
#[inline]
@@ -249,7 +266,7 @@ where
249266
self.index = 1;
250267
self.get_results_u64()[0]
251268
}
252-
}
269+
}.to_le()
253270
}
254271

255272
#[inline]
@@ -276,11 +293,11 @@ where
276293
}
277294
}
278295

296+
let mut buf = R::Results::default();
279297
let mut chunks = dest.chunks_exact_mut(rlen);
280298
for chunk in &mut chunks {
281-
let mut buf = R::Results::default();
282299
self.core.try_generate(&mut buf)?;
283-
chunk.copy_from_slice(buf.as_ref());
300+
chunk.copy_from_slice(Self::results_to_u8(&buf));
284301
}
285302

286303
let rem = chunks.into_remainder();

rand_hc/src/hc128.rs

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
//! The HC-128 random number generator.
1010
11-
use core::{fmt, slice};
11+
use core::fmt;
1212
use rand_core::block::{BlockRng, BlockRngCore};
1313
use rand_core::{le, CryptoRng, Error, RngCore, SeedableRng};
1414

@@ -134,30 +134,6 @@ impl fmt::Debug for Hc128Core {
134134
#[derive(Eq, PartialEq, Clone, Debug, Default)]
135135
pub struct Results([u64; 8]);
136136

137-
impl AsRef<[u8]> for Results {
138-
#[inline(always)]
139-
fn as_ref(&self) -> &[u8] {
140-
unsafe {
141-
slice::from_raw_parts(
142-
self.0.as_ptr() as *const u8,
143-
8 * self.0.len(),
144-
)
145-
}
146-
}
147-
}
148-
149-
impl AsRef<[u32]> for Results {
150-
#[inline(always)]
151-
fn as_ref(&self) -> &[u32] {
152-
unsafe {
153-
slice::from_raw_parts(
154-
self.0.as_ptr() as *const u32,
155-
2 * self.0.len(),
156-
)
157-
}
158-
}
159-
}
160-
161137
impl AsRef<[u64]> for Results {
162138
#[inline(always)]
163139
fn as_ref(&self) -> &[u64] {

src/rngs/small.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ type Rng = super::xoshiro128plusplus::Xoshiro128PlusPlus;
8181
pub struct SmallRng(Rng);
8282

8383
impl RngCore for SmallRng {
84+
#[inline(always)]
85+
fn next_bool(&mut self) -> bool {
86+
self.0.next_bool()
87+
}
88+
8489
#[inline(always)]
8590
fn next_u32(&mut self) -> u32 {
8691
self.0.next_u32()

src/rngs/thread.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,10 @@ impl Default for ThreadRng {
9898
impl RngCore for ThreadRng {
9999
#[inline(always)]
100100
fn next_bool(&mut self) -> bool {
101-
unsafe { self.rng.as_mut().next_bool() }
101+
// SAFETY: We must make sure to stop using `rng` before anyone else
102+
// creates another mutable reference
103+
let rng = unsafe { &mut *self.rng.get() };
104+
rng.next_bool()
102105
}
103106

104107
#[inline(always)]

src/rngs/xoshiro128plusplus.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ impl SeedableRng for Xoshiro128PlusPlus {
5959
}
6060

6161
impl RngCore for Xoshiro128PlusPlus {
62+
#[inline]
63+
fn next_bool(&mut self) -> bool {
64+
self.next_u32() & 1 != 0
65+
}
66+
6267
#[inline]
6368
fn next_u32(&mut self) -> u32 {
6469
let result_starstar = self.s[0]

src/rngs/xoshiro256plusplus.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ impl SeedableRng for Xoshiro256PlusPlus {
5959
}
6060

6161
impl RngCore for Xoshiro256PlusPlus {
62+
#[inline]
63+
fn next_bool(&mut self) -> bool {
64+
self.next_u64() & 1 != 0
65+
}
66+
6267
#[inline]
6368
fn next_u32(&mut self) -> u32 {
6469
// The lowest bits have some linear dependencies, so we use the

0 commit comments

Comments
 (0)