From 4600d39ac7e495e4d8dad1f5f6503f69bd8f7d80 Mon Sep 17 00:00:00 2001 From: James Walker Date: Tue, 28 Sep 2021 16:56:46 -0700 Subject: [PATCH] fix misaligned pointer use in hash code, which is undefined behavior in C++ --- OgreMain/src/Hash/MurmurHash3.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/OgreMain/src/Hash/MurmurHash3.cpp b/OgreMain/src/Hash/MurmurHash3.cpp index 7a251869035..948de8c8847 100644 --- a/OgreMain/src/Hash/MurmurHash3.cpp +++ b/OgreMain/src/Hash/MurmurHash3.cpp @@ -11,6 +11,7 @@ #include "OgrePlatform.h" #include "Hash/MurmurHash3.h" +#include //----------------------------------------------------------------------------- // Platform-specific functions and macros @@ -54,17 +55,20 @@ inline uint64_t rotl64 ( uint64_t x, int8_t r ) namespace Ogre { //----------------------------------------------------------------------------- -// Block read - if your platform needs to do endian-swapping or can only -// handle aligned reads, do the conversion here +// Block read - if your platform needs to do endian-swapping, do the conversion here -FORCE_INLINE uint32_t getblock32 ( const uint32_t * p, int i ) +FORCE_INLINE uint32_t getblock32 ( const uint8_t * p, int i ) { - return p[i]; + uint32_t dest; + memcpy( &dest, p + i * static_cast(sizeof(uint32_t)), sizeof(uint32_t) ); + return dest; } -FORCE_INLINE uint64_t getblock64 ( const uint64_t * p, int i ) +FORCE_INLINE uint64_t getblock64 ( const uint8_t * p, int i ) { - return p[i]; + uint64_t dest; + memcpy( &dest, p + i * static_cast(sizeof(uint64_t)), sizeof(uint64_t) ); + return dest; } //----------------------------------------------------------------------------- @@ -110,7 +114,7 @@ void _OgreExport MurmurHash3_x86_32 ( const void * key, const int len, //---------- // body - const uint32_t * blocks = (const uint32_t *)(data + nblocks*4); + const uint8_t * blocks = (const uint8_t *)(data + nblocks*4); for(int i = -nblocks; i; i++) { @@ -171,7 +175,7 @@ void _OgreExport MurmurHash3_x86_128 ( const void * key, const int len, //---------- // body - const uint32_t * blocks = (const uint32_t *)(data + nblocks*16); + const uint8_t * blocks = (const uint8_t *)(data + nblocks*16); for(int i = -nblocks; i; i++) { @@ -272,7 +276,7 @@ void _OgreExport MurmurHash3_x64_128 ( const void * key, const int len, //---------- // body - const uint64_t * blocks = (const uint64_t *)(data); + const uint8_t * blocks = (const uint8_t *)(data); for(int i = 0; i < nblocks; i++) {