diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2017-12-04 23:28:01 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2017-12-11 11:03:46 +0300 |
commit | 84d15fea828ab4b2bf16a957c1c953e23a7bc924 (patch) | |
tree | 24018ec96588b720787292aa01df27f405133ee3 | |
parent | a02c06b80712cff70eb668e4872b40794275deaf (diff) | |
download | libatomic_ops-84d15fea828ab4b2bf16a957c1c953e23a7bc924.tar.gz |
Fix AO_malloc for sizes near CHUNK_SIZE
Without this patch, e.g an object of CHUNK_SIZE is treated as non-large
in AO_malloc but freed by AO_free_large (incorrectly).
* src/atomic_ops_malloc.c (AO_malloc): Call AO_malloc_large() also for
size values in range CHUNK_SIZE-sizeof(AO_t)+1 .. CHUNK_SIZE.
-rw-r--r-- | src/atomic_ops_malloc.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/atomic_ops_malloc.c b/src/atomic_ops_malloc.c index c400c03..297b349 100644 --- a/src/atomic_ops_malloc.c +++ b/src/atomic_ops_malloc.c @@ -285,7 +285,7 @@ AO_malloc(size_t sz) AO_t *result; unsigned log_sz; - if (sz > CHUNK_SIZE) + if (sz > CHUNK_SIZE - sizeof(AO_t)) return AO_malloc_large(sz); log_sz = msb(sz + (sizeof(AO_t) - 1)); result = AO_stack_pop(AO_free_list+log_sz); |