aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2026-05-10 20:05:58 +0200
committerMattias Andrée <m@maandree.se>2026-05-10 20:05:58 +0200
commit5ee78f72e87d6305ec55466c79b7bb57c8ee614e (patch)
tree24add689447f1515ed324df07c4e5dbb2d39b1c6
parentfix doc text (diff)
downloadlibar2simplified-5ee78f72e87d6305ec55466c79b7bb57c8ee614e.tar.gz
libar2simplified-5ee78f72e87d6305ec55466c79b7bb57c8ee614e.tar.bz2
libar2simplified-5ee78f72e87d6305ec55466c79b7bb57c8ee614e.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.c17
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;
}