From e94f59edb121e49f3cf14ee80a71d8ab7f8d36c5 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 18 Oct 2024 08:22:42 +0200 Subject: [PATCH] IES_DECODE_U16 macro: load from 16-bit aligned address The IES_DECODE_U16 macro loads a 16 bit integer from an arbitrary address; this can lead to reads from misaligned addresses, and undefined behavior sanitizer warns, like, e.g., so: openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c:62:5: runtime error: load of misaligned address 0x7f3c24032c01 for type 'uint16_t', which requires 2 byte alignment To fix this, first use memcpy() to load to a 16-bit aligned address, then do the actual decoding. --- openair3/NAS/COMMON/UTIL/TLVDecoder.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openair3/NAS/COMMON/UTIL/TLVDecoder.h b/openair3/NAS/COMMON/UTIL/TLVDecoder.h index 5e3210f696..1f93d7a554 100644 --- a/openair3/NAS/COMMON/UTIL/TLVDecoder.h +++ b/openair3/NAS/COMMON/UTIL/TLVDecoder.h @@ -62,8 +62,12 @@ #define IES_DECODE_U8(bUFFER, dECODED, vALUE) \ DECODE_U8(bUFFER + dECODED, vALUE, dECODED) -#define IES_DECODE_U16(bUFFER, dECODED, vALUE) \ - DECODE_U16(bUFFER + dECODED, vALUE, dECODED) +#define IES_DECODE_U16(bUFFER, dECODED, vALUE) \ + do { \ + uint16_t val; \ + memcpy(&val, bUFFER + dECODED, sizeof(val)); \ + DECODE_U16(&val, vALUE, dECODED); \ + } while (0) #define IES_DECODE_U24(bUFFER, dECODED, vALUE) \ DECODE_U24(bUFFER + dECODED, vALUE, dECODED)