summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2017-05-31 03:47:18 +0200
committerGravatar Nikias Bassen2017-05-31 03:47:18 +0200
commitbe567b3ac81caee2fc6a2e91317d4fe9e3f95a7c (patch)
treebc7d9a05dbfc730141699eda7392067bd1da8768 /src
parentebd8083859b59bf3bed48468b52020cdba70f3bf (diff)
downloadlibplist-be567b3ac81caee2fc6a2e91317d4fe9e3f95a7c.tar.gz
libplist-be567b3ac81caee2fc6a2e91317d4fe9e3f95a7c.tar.bz2
bplist: Prevent store to misaligned address when writing real/date nodes
ASAN reported possible undefined behaviour when writing float/double values to misaligned addresses.
Diffstat (limited to 'src')
-rw-r--r--src/bplist.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/src/bplist.c b/src/bplist.c
index 67513e6..a9724b8 100644
--- a/src/bplist.c
+++ b/src/bplist.c
@@ -988,23 +988,23 @@ static void write_uint(bytearray_t * bplist, uint64_t val)
988static void write_real(bytearray_t * bplist, double val) 988static void write_real(bytearray_t * bplist, double val)
989{ 989{
990 int size = get_real_bytes(val); //cheat to know used space 990 int size = get_real_bytes(val); //cheat to know used space
991 uint8_t buff[9]; 991 uint8_t buff[16];
992 buff[0] = BPLIST_REAL | Log2(size); 992 buff[7] = BPLIST_REAL | Log2(size);
993 if (size == sizeof(float)) { 993 if (size == sizeof(float)) {
994 float floatval = (float)val; 994 float floatval = (float)val;
995 *(uint32_t*)(buff+1) = float_bswap32(*(uint32_t*)&floatval); 995 *(uint32_t*)(buff+8) = float_bswap32(*(uint32_t*)&floatval);
996 } else { 996 } else {
997 *(uint64_t*)(buff+1) = float_bswap64(*(uint64_t*)&val); 997 *(uint64_t*)(buff+8) = float_bswap64(*(uint64_t*)&val);
998 } 998 }
999 byte_array_append(bplist, buff, size+1); 999 byte_array_append(bplist, buff+7, size+1);
1000} 1000}
1001 1001
1002static void write_date(bytearray_t * bplist, double val) 1002static void write_date(bytearray_t * bplist, double val)
1003{ 1003{
1004 uint8_t buff[9]; 1004 uint8_t buff[16];
1005 buff[0] = BPLIST_DATE | 3; 1005 buff[7] = BPLIST_DATE | 3;
1006 *(uint64_t*)(buff+1) = float_bswap64(*(uint64_t*)&val); 1006 *(uint64_t*)(buff+8) = float_bswap64(*(uint64_t*)&val);
1007 byte_array_append(bplist, buff, sizeof(buff)); 1007 byte_array_append(bplist, buff+7, 9);
1008} 1008}
1009 1009
1010static void write_raw_data(bytearray_t * bplist, uint8_t mark, uint8_t * val, uint64_t size) 1010static void write_raw_data(bytearray_t * bplist, uint8_t mark, uint8_t * val, uint64_t size)