From e3e13c3bce273a05d7101d174db1d6e0f49a908d Mon Sep 17 00:00:00 2001 From: Diggory Hardy Date: Sat, 25 Nov 2017 17:38:40 +0000 Subject: [PATCH] Fix read_u64 for 32-bit platforms (Why you can't rely on .to_le() being correct I don't understand. If compiler is mixed-endian then to_le ought still do the correct swaps.) --- src/buffer.rs | 4 ++-- src/helper.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/buffer.rs b/src/buffer.rs index a39be99..af910e2 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -65,7 +65,7 @@ impl State { // Calculate the number of excessive bytes. These are bytes that could not be handled // in the loop above. - let mut excessive = buf.len() as usize + buf.as_ptr() as usize - end_ptr as usize; + let mut excessive = buf.len() % 32; // Handle the excessive bytes. match excessive { 0 => {}, @@ -73,7 +73,7 @@ impl State { // 1 or more excessive. // Write the last excessive bytes (<8 bytes). - a ^= helper::read_int(slice::from_raw_parts(ptr as *const u8, excessive)); + a ^= helper::read_int(slice::from_raw_parts(ptr, excessive)); // Diffuse. a = helper::diffuse(a); diff --git a/src/helper.rs b/src/helper.rs index df379a9..fbb9f6d 100644 --- a/src/helper.rs +++ b/src/helper.rs @@ -60,7 +60,7 @@ pub unsafe fn read_u64(ptr: *const u8) -> u64 { { // We cannot be sure about the memory layout of a potentially emulated 64-bit integer, so // we read it manually. If possible, the compiler should emit proper instructions. - (*(ptr as *const u32)).to_le() as u64 | ((*(ptr as *const u32)).to_le() as u64) << 32 + (*(ptr as *const u32)).to_le() as u64 | ((*(ptr as *const u32).offset(1)).to_le() as u64) << 32 } #[cfg(target_pointer_width = "64")] -- 2.21.0.rc1