From 27e742df1208753fb9d5de838a5acdfea7317e75 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Tue, 28 May 2019 03:55:04 +0300 Subject: [PATCH] engine: crclib: fix unaligned access --- engine/common/crclib.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/engine/common/crclib.c b/engine/common/crclib.c index c811ec7c..7b9b34c7 100644 --- a/engine/common/crclib.c +++ b/engine/common/crclib.c @@ -109,7 +109,7 @@ void CRC32_ProcessByte( dword *pulCRC, byte ch ) void CRC32_ProcessBuffer( dword *pulCRC, const void *pBuffer, int nBuffer ) { - dword ulCrc = *pulCRC; + dword ulCrc = *pulCRC, tmp; byte *pb = (byte *)pBuffer; uint nFront; int nMain; @@ -120,7 +120,8 @@ JustAfew: case 6: ulCrc = crc32table[*pb++ ^ (byte)ulCrc] ^ (ulCrc >> 8); case 5: ulCrc = crc32table[*pb++ ^ (byte)ulCrc] ^ (ulCrc >> 8); case 4: - ulCrc ^= *(dword *)pb; // warning, this only works on little-endian. + memcpy( &tmp, pb, sizeof(dword)); + ulCrc ^= tmp; // warning, this only works on little-endian. ulCrc = crc32table[(byte)ulCrc] ^ (ulCrc >> 8); ulCrc = crc32table[(byte)ulCrc] ^ (ulCrc >> 8); ulCrc = crc32table[(byte)ulCrc] ^ (ulCrc >> 8); @@ -151,12 +152,14 @@ JustAfew: nMain = nBuffer >> 3; while( nMain-- ) { - ulCrc ^= *(dword *)pb; // warning, this only works on little-endian. + memcpy( &tmp, pb, sizeof(dword)); + ulCrc ^= tmp; // warning, this only works on little-endian. ulCrc = crc32table[(byte)ulCrc] ^ (ulCrc >> 8); ulCrc = crc32table[(byte)ulCrc] ^ (ulCrc >> 8); ulCrc = crc32table[(byte)ulCrc] ^ (ulCrc >> 8); ulCrc = crc32table[(byte)ulCrc] ^ (ulCrc >> 8); - ulCrc ^= *(dword *)(pb + 4);// warning, this only works on little-endian. + memcpy( &tmp, pb + 4, sizeof(dword)); + ulCrc ^= tmp; // warning, this only works on little-endian. ulCrc = crc32table[(byte)ulCrc] ^ (ulCrc >> 8); ulCrc = crc32table[(byte)ulCrc] ^ (ulCrc >> 8); ulCrc = crc32table[(byte)ulCrc] ^ (ulCrc >> 8);