diff options
author | DJ Delorie <dj@redhat.com> | 2023-04-03 17:33:03 -0400 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2023-04-18 10:58:42 -0400 |
commit | e5524ef335dc8e28d64cc376d57c219e566fcf53 (patch) | |
tree | 92fc25b1af0bbc50710619d42aeba02c17baa0c7 /malloc/tst-memalign-2.c | |
parent | 8895a99c10349e5b0bb57b64c229389169a312e0 (diff) | |
download | glibc-e5524ef335dc8e28d64cc376d57c219e566fcf53.zip glibc-e5524ef335dc8e28d64cc376d57c219e566fcf53.tar.gz glibc-e5524ef335dc8e28d64cc376d57c219e566fcf53.tar.bz2 |
malloc: set NON_MAIN_ARENA flag for reclaimed memalign chunk (BZ #30101)
Based on these comments in malloc.c:
size field is or'ed with NON_MAIN_ARENA if the chunk was obtained
from a non-main arena. This is only set immediately before handing
the chunk to the user, if necessary.
The NON_MAIN_ARENA flag is never set for unsorted chunks, so it
does not have to be taken into account in size comparisons.
When we pull a chunk off the unsorted list (or any list) we need to
make sure that flag is set properly before returning the chunk.
Use the rounded-up size for chunk_ok_for_memalign()
Do not scan the arena for reusable chunks if there's no arena.
Account for chunk overhead when determining if a chunk is a reuse
candidate.
mcheck interferes with memalign, so skip mcheck variants of
memalign tests.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'malloc/tst-memalign-2.c')
-rw-r--r-- | malloc/tst-memalign-2.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/malloc/tst-memalign-2.c b/malloc/tst-memalign-2.c index 4996578..f229283 100644 --- a/malloc/tst-memalign-2.c +++ b/malloc/tst-memalign-2.c @@ -33,9 +33,10 @@ typedef struct TestCase { } TestCase; static TestCase tcache_allocs[] = { - { 24, 8, NULL, NULL }, - { 24, 16, NULL, NULL }, - { 128, 32, NULL, NULL } + { 24, 32, NULL, NULL }, + { 24, 64, NULL, NULL }, + { 128, 128, NULL, NULL }, + { 500, 128, NULL, NULL } }; #define TN array_length (tcache_allocs) @@ -70,11 +71,15 @@ do_test (void) for (i = 0; i < TN; ++ i) { + size_t sz2; + tcache_allocs[i].ptr1 = memalign (tcache_allocs[i].alignment, tcache_allocs[i].size); CHECK (tcache_allocs[i].ptr1, tcache_allocs[i].alignment); + sz2 = malloc_usable_size (tcache_allocs[i].ptr1); free (tcache_allocs[i].ptr1); + /* This should return the same chunk as was just free'd. */ - tcache_allocs[i].ptr2 = memalign (tcache_allocs[i].alignment, tcache_allocs[i].size); + tcache_allocs[i].ptr2 = memalign (tcache_allocs[i].alignment, sz2); CHECK (tcache_allocs[i].ptr2, tcache_allocs[i].alignment); free (tcache_allocs[i].ptr2); |