From ee8c0906f0914da8fa20bbc4c2772286d05ed1af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Tue, 8 Jul 2014 15:59:23 -0400 Subject: [PATCH] libfreerdp-codec: fix strict aliasing warnings in ncrush code --- libfreerdp/codec/ncrush.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/libfreerdp/codec/ncrush.c b/libfreerdp/codec/ncrush.c index cfb136e4d..e57ecf259 100644 --- a/libfreerdp/codec/ncrush.c +++ b/libfreerdp/codec/ncrush.c @@ -1768,6 +1768,7 @@ int ncrush_decompress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BY BYTE* SrcPtr; BYTE* SrcEnd; UINT16 Mask; + UINT16* pMask; BYTE Literal; UINT32 IndexLEC; UINT32 BitLength; @@ -1829,7 +1830,8 @@ int ncrush_decompress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BY { while (1) { - Mask = *((UINT16*) &HuffTableMask[29]); + pMask = (UINT16*) &HuffTableMask[29]; + Mask = *pMask; MaskedBits = bits & Mask; IndexLEC = HuffTableLEC[MaskedBits] & 0xFFF; @@ -1869,7 +1871,8 @@ int ncrush_decompress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BY CopyOffset = ncrush->OffsetCache[OffsetCacheIndex]; - Mask = *((UINT16*) &HuffTableMask[21]); + pMask = (UINT16*) &HuffTableMask[21]; + Mask = *pMask; MaskedBits = bits & Mask; LengthOfMatch = HuffTableLOM[MaskedBits] & 0xFFF; @@ -1885,7 +1888,8 @@ int ncrush_decompress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BY if (LengthOfMatchBits) { - Mask = *((UINT16*) &HuffTableMask[(2 * LengthOfMatchBits) + 3]); + pMask = (UINT16*) &HuffTableMask[(2 * LengthOfMatchBits) + 3]; + Mask = *pMask; MaskedBits = bits & Mask; bits >>= LengthOfMatchBits; @@ -1908,7 +1912,8 @@ int ncrush_decompress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BY if (CopyOffsetBits) { - Mask = *((UINT16*) &HuffTableMask[(2 * CopyOffsetBits) + 3]); + pMask = (UINT16*) &HuffTableMask[(2 * CopyOffsetBits) + 3]; + Mask = *pMask; MaskedBits = bits & Mask; CopyOffset = CopyOffsetBase + MaskedBits - 1; @@ -1919,7 +1924,8 @@ int ncrush_decompress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BY NCrushFetchBits(); } - Mask = *((UINT16*) &HuffTableMask[21]); + pMask = (UINT16*) &HuffTableMask[21]; + Mask = *pMask; MaskedBits = bits & Mask; LengthOfMatch = HuffTableLOM[MaskedBits] & 0xFFF; @@ -1935,7 +1941,8 @@ int ncrush_decompress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BY if (LengthOfMatchBits) { - Mask = *((UINT16*) &HuffTableMask[(2 * LengthOfMatchBits) + 3]); + pMask = (UINT16*) &HuffTableMask[(2 * LengthOfMatchBits) + 3]; + Mask = *pMask; MaskedBits = bits & Mask; bits >>= LengthOfMatchBits; @@ -2248,6 +2255,7 @@ int ncrush_compress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BYTE UINT32 IndexLOM; UINT32 IndexCO; UINT32 CodeLEC; + UINT16* pCodeLEC; UINT32 BitLength; UINT32 CopyOffset; UINT32 MatchOffset; @@ -2367,7 +2375,8 @@ int ncrush_compress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BYTE IndexLEC = Literal; BitLength = HuffLengthLEC[IndexLEC]; - CodeLEC = *((UINT16*) &HuffCodeLEC[IndexLEC * 2]); + pCodeLEC = (UINT16*) &HuffCodeLEC[IndexLEC * 2]; + CodeLEC = (UINT32) *pCodeLEC; if (BitLength > 15) return -1006; @@ -2454,7 +2463,8 @@ int ncrush_compress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BYTE IndexLEC = 257 + CopyOffsetIndex; BitLength = HuffLengthLEC[IndexLEC]; - CodeLEC = *((UINT16*) &HuffCodeLEC[IndexLEC * 2]); + pCodeLEC = (UINT16*) &HuffCodeLEC[IndexLEC * 2]; + CodeLEC = (UINT32) *pCodeLEC; if (BitLength > 15) return -1008; @@ -2493,7 +2503,8 @@ int ncrush_compress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BYTE IndexLEC = 289 + OffsetCacheIndex; BitLength = HuffLengthLEC[IndexLEC]; - CodeLEC = *((UINT16*) &HuffCodeLEC[IndexLEC * 2]); + pCodeLEC = (UINT16*) &HuffCodeLEC[IndexLEC * 2]; + CodeLEC = (UINT32) *pCodeLEC; if (BitLength >= 15) return -1011; @@ -2541,7 +2552,8 @@ int ncrush_compress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BYTE IndexLEC = Literal; BitLength = HuffLengthLEC[IndexLEC]; - CodeLEC = *((UINT16*) &HuffCodeLEC[IndexLEC * 2]); + pCodeLEC = (UINT16*) &HuffCodeLEC[IndexLEC * 2]; + CodeLEC = (UINT32) *pCodeLEC; if (BitLength > 15) return -1014; @@ -2565,7 +2577,8 @@ int ncrush_compress(NCRUSH_CONTEXT* ncrush, BYTE* pSrcData, UINT32 SrcSize, BYTE if (BitLength > 15) return -1015; - bits = *((UINT16*) &HuffCodeLEC[IndexLEC * 2]); + pCodeLEC = (UINT16*) &HuffCodeLEC[IndexLEC * 2]; + bits = (UINT32) *pCodeLEC; NCrushWriteBits(bits, BitLength);