1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-11-30 11:41:39 +03:00

malloc: Use _int_free_chunk in tcache_thread_shutdown

Directly call _int_free_chunk during tcache shutdown to avoid recursion.
Calling __libc_free on a block from tcache gets flagged as a double free,
and tcache_double_free_verify checks every tcache chunk (quadratic
overhead).

Reviewed-by: Arjun Shankar <arjun@redhat.com>
This commit is contained in:
Wilco Dijkstra
2025-08-29 12:47:54 +00:00
parent 92186652d8
commit 7f670284d8

View File

@@ -3377,6 +3377,7 @@ static void
tcache_thread_shutdown (void) tcache_thread_shutdown (void)
{ {
int i; int i;
mchunkptr p;
tcache_perthread_struct *tcache_tmp = tcache; tcache_perthread_struct *tcache_tmp = tcache;
int need_free = tcache_enabled (); int need_free = tcache_enabled ();
@@ -3396,11 +3397,14 @@ tcache_thread_shutdown (void)
malloc_printerr ("tcache_thread_shutdown(): " malloc_printerr ("tcache_thread_shutdown(): "
"unaligned tcache chunk detected"); "unaligned tcache chunk detected");
tcache_tmp->entries[i] = REVEAL_PTR (e->next); tcache_tmp->entries[i] = REVEAL_PTR (e->next);
__libc_free (e); e->key = 0;
p = mem2chunk (e);
_int_free_chunk (arena_for_chunk (p), p, chunksize (p), 0);
} }
} }
__libc_free (tcache_tmp); p = mem2chunk (tcache_tmp);
_int_free_chunk (arena_for_chunk (p), p, chunksize (p), 0);
} }
/* Initialize tcache. In the rare case there isn't any memory available, /* Initialize tcache. In the rare case there isn't any memory available,