diff options
| author | Mattias Andrée <m@maandree.se> | 2026-05-10 20:05:58 +0200 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-05-10 20:05:58 +0200 |
| commit | 5ee78f72e87d6305ec55466c79b7bb57c8ee614e (patch) | |
| tree | 24add689447f1515ed324df07c4e5dbb2d39b1c6 | |
| parent | fix doc text (diff) | |
| download | libar2simplified-1.1.4.tar.gz libar2simplified-1.1.4.tar.bz2 libar2simplified-1.1.4.tar.xz | |
Erase allocation bookkeeping before free + Make allocation bookkeeping more robust1.1.4
Signed-off-by: Mattias Andrée <m@maandree.se>
| -rw-r--r-- | libar2simplified_init_context.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/libar2simplified_init_context.c b/libar2simplified_init_context.c index 9dcbfb0..ad35f13 100644 --- a/libar2simplified_init_context.c +++ b/libar2simplified_init_context.c @@ -53,11 +53,11 @@ allocate(size_t num, size_t size, size_t alignment, struct libar2_context *ctx) size_t pad = (alignment - ((2 * sizeof(size_t)) & (alignment - 1))) & (alignment - 1); char *ptr = alignedalloc(num, size, pad + 2 * sizeof(size_t), alignment); if (ptr) { - ptr = &ptr[pad]; - *(size_t *)ptr = pad; - ptr = &ptr[sizeof(size_t)]; - *(size_t *)ptr = num * size; - ptr = &ptr[sizeof(size_t)]; + ptr += pad; + memcpy(ptr, &pad, sizeof(size_t)); + ptr += sizeof(size_t); + memcpy(ptr, &(size_t){num * size}, sizeof(size_t)); + ptr += sizeof(size_t); } (void) ctx; return ptr; @@ -68,10 +68,13 @@ static void deallocate(void *ptr, struct libar2_context *ctx) { char *p = ptr; + size_t size, pad; p -= sizeof(size_t); - libar2_erase(ptr, *(size_t *)p); + memcpy(&size, p, sizeof(size_t)); p -= sizeof(size_t); - p -= *(size_t *)p; + memcpy(&pad, p, sizeof(size_t)); + p -= pad; + libar2_erase(p, size + pad + 2u * sizeof(size_t)); free(p); (void) ctx; } |
