Blob Blame History Raw
From e3e13c3bce273a05d7101d174db1d6e0f49a908d Mon Sep 17 00:00:00 2001
From: Diggory Hardy <git@dhardy.name>
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