Alle lunedì 19 novembre 2012, Roland McGrath ha scritto:
> That change is good but it needs a comment. You don't need to go
> into great detail, just say that we call fprintf+fclose after
> clearing the hooks to match how mtrace called fopen+fprintf before
> setting them.
A bit of comment added.
--
Pino Toscano
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.
2012-11-19 Pino Toscano
* malloc/mtrace.c (muntrace): Reset MALLSTREAM and the hooks before
finalizing MALLSTREAM.
--- a/malloc/mtrace.c
+++ b/malloc/mtrace.c
@@ -361,14 +361,21 @@ mtrace ()
void
muntrace ()
{
+ FILE *f;
+
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. */
+ 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);
}
signature.asc
Description: This is a digitally signed message part.