summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Collet <Cyan4973@users.noreply.github.com>2022-09-17 03:42:42 (GMT)
committerGitHub <noreply@github.com>2022-09-17 03:42:42 (GMT)
commitf39c0810bc5b8081bd61e2abf31500f03dc56a95 (patch)
treeeb8528dee8a30e726fbfc992a33bc1f11b283648
parent27c9530b757afe7915d0e0d1622f4d1089b66b3c (diff)
parentdc944197e683fc566cdc3b05b9064635bc2d8edd (diff)
downloadlz4-f39c0810bc5b8081bd61e2abf31500f03dc56a95.zip
lz4-f39c0810bc5b8081bd61e2abf31500f03dc56a95.tar.gz
lz4-f39c0810bc5b8081bd61e2abf31500f03dc56a95.tar.bz2
Merge pull request #1169 from lz4/fix_ub485
fix rare ub
-rw-r--r--lib/lz4.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/lz4.c b/lib/lz4.c
index 955e864..104227c 100644
--- a/lib/lz4.c
+++ b/lib/lz4.c
@@ -379,14 +379,16 @@ static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; }
/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */
/* currently only defined for gcc and icc */
-typedef union { U16 u16; U32 u32; reg_t uArch; } __attribute__((packed)) LZ4_unalign;
+typedef struct { U16 u16; } __attribute__((packed)) LZ4_unalign16;
+typedef struct { U32 u32; } __attribute__((packed)) LZ4_unalign32;
+typedef struct { reg_t uArch; } __attribute__((packed)) LZ4_unalignST;
-static U16 LZ4_read16(const void* ptr) { return ((const LZ4_unalign*)ptr)->u16; }
-static U32 LZ4_read32(const void* ptr) { return ((const LZ4_unalign*)ptr)->u32; }
-static reg_t LZ4_read_ARCH(const void* ptr) { return ((const LZ4_unalign*)ptr)->uArch; }
+static U16 LZ4_read16(const void* ptr) { return ((const LZ4_unalign16*)ptr)->u16; }
+static U32 LZ4_read32(const void* ptr) { return ((const LZ4_unalign32*)ptr)->u32; }
+static reg_t LZ4_read_ARCH(const void* ptr) { return ((const LZ4_unalignST*)ptr)->uArch; }
-static void LZ4_write16(void* memPtr, U16 value) { ((LZ4_unalign*)memPtr)->u16 = value; }
-static void LZ4_write32(void* memPtr, U32 value) { ((LZ4_unalign*)memPtr)->u32 = value; }
+static void LZ4_write16(void* memPtr, U16 value) { ((LZ4_unalign16*)memPtr)->u16 = value; }
+static void LZ4_write32(void* memPtr, U32 value) { ((LZ4_unalign32*)memPtr)->u32 = value; }
#else /* safe and portable access using memcpy() */