Skip to content

Commit c0b6678

Browse files
mina86BurntSushi
authored andcommitted
impl: remove unsafe code from read_uint and read_uint128 methods
Rewrite read_uint and read_uint128 methods such that they no longer use unsafe code. Rather than casting pointers and doing unsafe copies, declare output byte buffer for the read number and use from_xx_bytes method to convert those read bytes to a number. Closes #192
1 parent 1e2d8b0 commit c0b6678

File tree

1 file changed

+18
-36
lines changed

1 file changed

+18
-36
lines changed

src/lib.rs

+18-36
Original file line numberDiff line numberDiff line change
@@ -1955,32 +1955,20 @@ impl ByteOrder for BigEndian {
19551955

19561956
#[inline]
19571957
fn read_uint(buf: &[u8], nbytes: usize) -> u64 {
1958-
assert!(1 <= nbytes && nbytes <= 8 && nbytes <= buf.len());
1959-
let mut out = 0u64;
1960-
let ptr_out = &mut out as *mut u64 as *mut u8;
1961-
unsafe {
1962-
copy_nonoverlapping(
1963-
buf.as_ptr(),
1964-
ptr_out.offset((8 - nbytes) as isize),
1965-
nbytes,
1966-
);
1967-
}
1968-
out.to_be()
1958+
let mut out = [0; 8];
1959+
assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
1960+
let start = out.len() - nbytes;
1961+
out[start..].copy_from_slice(&buf[..nbytes]);
1962+
u64::from_be_bytes(out)
19691963
}
19701964

19711965
#[inline]
19721966
fn read_uint128(buf: &[u8], nbytes: usize) -> u128 {
1973-
assert!(1 <= nbytes && nbytes <= 16 && nbytes <= buf.len());
1974-
let mut out: u128 = 0;
1975-
let ptr_out = &mut out as *mut u128 as *mut u8;
1976-
unsafe {
1977-
copy_nonoverlapping(
1978-
buf.as_ptr(),
1979-
ptr_out.offset((16 - nbytes) as isize),
1980-
nbytes,
1981-
);
1982-
}
1983-
out.to_be()
1967+
let mut out = [0; 16];
1968+
assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
1969+
let start = out.len() - nbytes;
1970+
out[start..].copy_from_slice(&buf[..nbytes]);
1971+
u128::from_be_bytes(out)
19841972
}
19851973

19861974
#[inline]
@@ -2155,24 +2143,18 @@ impl ByteOrder for LittleEndian {
21552143

21562144
#[inline]
21572145
fn read_uint(buf: &[u8], nbytes: usize) -> u64 {
2158-
assert!(1 <= nbytes && nbytes <= 8 && nbytes <= buf.len());
2159-
let mut out = 0u64;
2160-
let ptr_out = &mut out as *mut u64 as *mut u8;
2161-
unsafe {
2162-
copy_nonoverlapping(buf.as_ptr(), ptr_out, nbytes);
2163-
}
2164-
out.to_le()
2146+
let mut out = [0; 8];
2147+
assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
2148+
out[..nbytes].copy_from_slice(&buf[..nbytes]);
2149+
u64::from_le_bytes(out)
21652150
}
21662151

21672152
#[inline]
21682153
fn read_uint128(buf: &[u8], nbytes: usize) -> u128 {
2169-
assert!(1 <= nbytes && nbytes <= 16 && nbytes <= buf.len());
2170-
let mut out: u128 = 0;
2171-
let ptr_out = &mut out as *mut u128 as *mut u8;
2172-
unsafe {
2173-
copy_nonoverlapping(buf.as_ptr(), ptr_out, nbytes);
2174-
}
2175-
out.to_le()
2154+
let mut out = [0; 16];
2155+
assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
2156+
out[..nbytes].copy_from_slice(&buf[..nbytes]);
2157+
u128::from_le_bytes(out)
21762158
}
21772159

21782160
#[inline]

0 commit comments

Comments
 (0)