mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
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>
This commit is contained in:
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user