muntrace: reset file and hooks before finalizing the stream
authorPino Toscano <toscano.pino@tiscali.it>
Mon, 19 Nov 2012 19:01:00 +0000 (20:01 +0100)
committerPino Toscano <toscano.pino@tiscali.it>
Mon, 19 Nov 2012 19:01:00 +0000 (20:01 +0100)
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.

ChangeLog
malloc/mtrace.c

index fbac1c5..1031d4d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2012-11-19  Pino Toscano  <toscano.pino@tiscali.it>
 
+       * malloc/mtrace.c (muntrace): Reset MALLSTREAM and the hooks before
+       finalizing MALLSTREAM.
+
        * sysdeps/mach/hurd/syncfs.c: New file.
 
 2012-11-19  Siddhesh Poyarekar  <siddhesh@redhat.com>
index d7a032a..3f02c71 100644 (file)
@@ -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);
 }