From 5ae2adabc9d5254fe4077a08f7de3437e7fc3581 Mon Sep 17 00:00:00 2001 From: Kai Vogelgesang Date: Fri, 24 Aug 2018 16:25:49 +0200 Subject: [PATCH] Fix some issues that fsanitize=undefined found --- prrt/proto/types/packet.c | 13 +++++++++---- prrt/util/bitmap.h | 6 +++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/prrt/proto/types/packet.c b/prrt/proto/types/packet.c index b443b58a..114182d5 100644 --- a/prrt/proto/types/packet.c +++ b/prrt/proto/types/packet.c @@ -160,8 +160,10 @@ bool PrrtPacket_encode(void *buf_ptr, uint16_t buf_size, PrrtPacket *packet_ptr) #define PrrtPacketField_encode(payload, buf_ptr, field_t, field, conversion) \ do { \ - field_t *ptr = (field_t *) (buf_ptr); \ - *ptr = conversion((payload)->field); \ + field_t PrrtPacketField_encode_value = conversion((payload)->field); \ + /* memcpy to avoid misaligned access. + * The compiler will optimize this into appropriate mov instructions */ \ + memcpy(buf_ptr, &PrrtPacketField_encode_value, sizeof(field_t)); \ (buf_ptr) += sizeof(field_t); \ } while (false) @@ -254,8 +256,11 @@ bool PrrtPacket_decode(void *srcBuffer, uint16_t srcBufferSize, PrrtPacket *targ #define PrrtPacketField_decode(payload, buf_ptr, field_t, field, conversion) \ do { \ - field_t *PrrtPacketField_decode_ptr = (field_t *) (buf_ptr); \ - (payload)->field = conversion(*PrrtPacketField_decode_ptr); \ + field_t PrrtPacketField_decode_value; \ + /* memcpy to avoid misaligned access. + * The compiler will optimize this into appropriate mov instructions */ \ + memcpy(&PrrtPacketField_decode_value, buf_ptr, sizeof(field_t)); \ + (payload)->field = conversion(PrrtPacketField_decode_value); \ (buf_ptr) += sizeof(field_t); \ } while (false) diff --git a/prrt/util/bitmap.h b/prrt/util/bitmap.h index 73bd589e..f4a27e76 100644 --- a/prrt/util/bitmap.h +++ b/prrt/util/bitmap.h @@ -26,14 +26,14 @@ BITMAP_EXPOSED_FUNCTION bool Bitmap_get(Bitmap *bitmap, uint32_t position) { uint32_t byte_offset = position / 32; uint32_t bit_offset = position % 32; - return (bool) ((bitmap->data[byte_offset] & (1 << bit_offset)) != 0); + return (bool) ((bitmap->data[byte_offset] & (1u << bit_offset)) != 0); } BITMAP_EXPOSED_FUNCTION bool Bitmap_set_0(Bitmap *bitmap, uint32_t position) { uint32_t byte_offset = position / 32; uint32_t bit_offset = position % 32; - bitmap->data[byte_offset] &= ~(1 << bit_offset); + bitmap->data[byte_offset] &= ~(1u << bit_offset); return true; } @@ -41,7 +41,7 @@ BITMAP_EXPOSED_FUNCTION bool Bitmap_set_1(Bitmap *bitmap, uint32_t position) { uint32_t byte_offset = position / 32; uint32_t bit_offset = position % 32; - bitmap->data[byte_offset] |= (1 << bit_offset); + bitmap->data[byte_offset] |= (1u << bit_offset); return true; } -- GitLab