mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-24 17:51:17 +03:00
muntrace: reset file and hooks before finalizing the stream
fclose will call free, invoking its hook, then fprintf which would indirectly try to allocate a buffer, and this can cause malloc to be used (thus its hook to be invoked) if libio uses malloc instead of mmap; given any malloc/free hook locks the internal lock, this leads to a deadlock. To prevent this hook roundtrip at muntrace, first unset MALLSTREAM and the hooks, and only after that close the trace file.
This commit is contained in:
@@ -364,11 +364,16 @@ muntrace ()
|
||||
if (mallstream == NULL)
|
||||
return;
|
||||
|
||||
fprintf (mallstream, "= End\n");
|
||||
fclose (mallstream);
|
||||
/* Do the reverse of what done in mtrace: first reset the hooks and
|
||||
MALLSTREAM, and only after that write the trailer and close the
|
||||
file. */
|
||||
FILE *f = mallstream;
|
||||
mallstream = NULL;
|
||||
__free_hook = tr_old_free_hook;
|
||||
__malloc_hook = tr_old_malloc_hook;
|
||||
__realloc_hook = tr_old_realloc_hook;
|
||||
__memalign_hook = tr_old_memalign_hook;
|
||||
|
||||
fprintf (f, "= End\n");
|
||||
fclose (f);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user