Siddhesh Poyarekar 216cf91
diff -pruN a/malloc/arena.c b/malloc/arena.c
Siddhesh Poyarekar 216cf91
--- a/malloc/arena.c	2014-01-07 07:07:47.000000000 +0530
Siddhesh Poyarekar 216cf91
+++ b/malloc/arena.c	2014-01-07 14:11:40.093628218 +0530
Siddhesh Poyarekar 216cf91
@@ -702,7 +702,7 @@ heap_trim (heap_info *heap, size_t pad)
Siddhesh Poyarekar 216cf91
       if (!prev_inuse (p)) /* consolidate backward */
Siddhesh Poyarekar 216cf91
         {
Siddhesh Poyarekar 216cf91
           p = prev_chunk (p);
Siddhesh Poyarekar 216cf91
-          unlink (p, bck, fwd);
Siddhesh Poyarekar 216cf91
+	  unlink (ar_ptr, p, bck, fwd);
Siddhesh Poyarekar 216cf91
         }
Siddhesh Poyarekar 216cf91
       assert (((unsigned long) ((char *) p + new_size) & (pagesz - 1)) == 0);
Siddhesh Poyarekar 216cf91
       assert (((char *) p + new_size) == ((char *) heap + heap->size));
Siddhesh Poyarekar 216cf91
diff -pruN a/malloc/hooks.c b/malloc/hooks.c
Siddhesh Poyarekar 216cf91
--- a/malloc/hooks.c	2014-01-07 07:07:47.000000000 +0530
Siddhesh Poyarekar 216cf91
+++ b/malloc/hooks.c	2014-01-07 14:12:41.804625603 +0530
Siddhesh Poyarekar 216cf91
@@ -237,7 +237,9 @@ top_check (void)
Siddhesh Poyarekar 216cf91
         (char *) t + chunksize (t) == mp_.sbrk_base + main_arena.system_mem)))
2716093
     return 0;
2716093
 
Siddhesh Poyarekar 2415b86
+  mutex_unlock(&main_arena.mutex);
2716093
   malloc_printerr (check_action, "malloc: top chunk is corrupt", t);
Siddhesh Poyarekar 2415b86
+  mutex_lock(&main_arena.mutex);
2716093
 
2716093
   /* Try to set up a new top chunk. */
Siddhesh Poyarekar 216cf91
   brk = MORECORE (0);
Siddhesh Poyarekar 216cf91
diff -pruN a/malloc/malloc.c b/malloc/malloc.c
Siddhesh Poyarekar 216cf91
--- a/malloc/malloc.c	2014-01-07 07:07:47.000000000 +0530
Siddhesh Poyarekar 216cf91
+++ b/malloc/malloc.c	2014-01-07 14:29:53.370581893 +0530
Siddhesh Poyarekar 216cf91
@@ -1404,11 +1404,15 @@ typedef struct malloc_chunk *mbinptr;
2716093
 #define last(b)      ((b)->bk)
2716093
 
2716093
 /* Take a chunk off a bin list */
2716093
-#define unlink(P, BK, FD) {                                            \
Siddhesh Poyarekar 216cf91
+#define unlink(AV, P, BK, FD) {                                            \
Siddhesh Poyarekar 216cf91
     FD = P->fd;								      \
Siddhesh Poyarekar 216cf91
     BK = P->bk;								      \
Siddhesh Poyarekar 216cf91
     if (__builtin_expect (FD->bk != P || BK->fd != P, 0))		      \
Siddhesh Poyarekar 216cf91
-      malloc_printerr (check_action, "corrupted double-linked list", P);      \
Siddhesh Poyarekar 216cf91
+      {									      \
Siddhesh Poyarekar 216cf91
+	mutex_unlock(&(AV)->mutex);					      \
Siddhesh Poyarekar 216cf91
+	malloc_printerr (check_action, "corrupted double-linked list", P);    \
Siddhesh Poyarekar 216cf91
+	mutex_lock(&(AV)->mutex);					      \
Siddhesh Poyarekar 216cf91
+      }									      \
Siddhesh Poyarekar 216cf91
     else {								      \
Siddhesh Poyarekar 216cf91
         FD->bk = BK;							      \
Siddhesh Poyarekar 216cf91
         BK->fd = FD;							      \
Siddhesh Poyarekar 216cf91
@@ -2524,7 +2528,9 @@ sysmalloc (INTERNAL_SIZE_T nb, mstate av
Siddhesh Poyarekar 216cf91
           else if (contiguous (av) && old_size && brk < old_end)
Siddhesh Poyarekar 216cf91
             {
Siddhesh Poyarekar 216cf91
               /* Oops!  Someone else killed our space..  Can't touch anything.  */
Siddhesh Poyarekar 216cf91
+	      mutex_unlock(&av->mutex);
Siddhesh Poyarekar 216cf91
               malloc_printerr (3, "break adjusted to free malloc space", brk);
Siddhesh Poyarekar 216cf91
+	      mutex_lock(&av->mutex);
Siddhesh Poyarekar 216cf91
             }
Siddhesh Poyarekar 216cf91
 
Siddhesh Poyarekar 216cf91
           /*
Siddhesh Poyarekar 216cf91
@@ -3353,7 +3359,9 @@ _int_malloc (mstate av, size_t bytes)
Siddhesh Poyarekar 216cf91
             {
Siddhesh Poyarekar 216cf91
               errstr = "malloc(): memory corruption (fast)";
Siddhesh Poyarekar 216cf91
             errout:
Siddhesh Poyarekar 216cf91
+	      mutex_unlock(&av->mutex);
Siddhesh Poyarekar 216cf91
               malloc_printerr (check_action, errstr, chunk2mem (victim));
Siddhesh Poyarekar 216cf91
+	      mutex_lock(&av->mutex);
Siddhesh Poyarekar 216cf91
               return NULL;
Siddhesh Poyarekar 216cf91
             }
Siddhesh Poyarekar 216cf91
           check_remalloced_chunk (av, victim, nb);
Siddhesh Poyarekar 216cf91
@@ -3441,8 +3449,12 @@ _int_malloc (mstate av, size_t bytes)
Siddhesh Poyarekar 216cf91
           bck = victim->bk;
Siddhesh Poyarekar 216cf91
           if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
Siddhesh Poyarekar 216cf91
               || __builtin_expect (victim->size > av->system_mem, 0))
Siddhesh Poyarekar 216cf91
-            malloc_printerr (check_action, "malloc(): memory corruption",
Siddhesh Poyarekar 216cf91
-                             chunk2mem (victim));
Siddhesh Poyarekar 216cf91
+	    {
Siddhesh Poyarekar 216cf91
+	      void *p = chunk2mem(victim);
Siddhesh Poyarekar 216cf91
+	      mutex_unlock(&av->mutex);
Siddhesh Poyarekar 216cf91
+	      malloc_printerr (check_action, "malloc(): memory corruption", p);
Siddhesh Poyarekar 216cf91
+	      mutex_lock(&av->mutex);
Siddhesh Poyarekar 216cf91
+	    }
Siddhesh Poyarekar 216cf91
           size = chunksize (victim);
Siddhesh Poyarekar 216cf91
 
Siddhesh Poyarekar 216cf91
           /*
Siddhesh Poyarekar 216cf91
@@ -3589,7 +3601,7 @@ _int_malloc (mstate av, size_t bytes)
Siddhesh Poyarekar 216cf91
                 victim = victim->fd;
Siddhesh Poyarekar 216cf91
 
Siddhesh Poyarekar 216cf91
               remainder_size = size - nb;
Siddhesh Poyarekar 216cf91
-              unlink (victim, bck, fwd);
Siddhesh Poyarekar 216cf91
+              unlink (av, victim, bck, fwd);
Siddhesh Poyarekar 216cf91
 
Siddhesh Poyarekar 216cf91
               /* Exhaust */
Siddhesh Poyarekar 216cf91
               if (remainder_size < MINSIZE)
Siddhesh Poyarekar 216cf91
@@ -3694,7 +3706,7 @@ _int_malloc (mstate av, size_t bytes)
Siddhesh Poyarekar 216cf91
               remainder_size = size - nb;
Siddhesh Poyarekar 216cf91
 
Siddhesh Poyarekar 216cf91
               /* unlink */
Siddhesh Poyarekar 216cf91
-              unlink (victim, bck, fwd);
Siddhesh Poyarekar 216cf91
+              unlink (av, victim, bck, fwd);
Siddhesh Poyarekar 216cf91
 
Siddhesh Poyarekar 216cf91
               /* Exhaust */
Siddhesh Poyarekar 216cf91
               if (remainder_size < MINSIZE)
Siddhesh Poyarekar 216cf91
@@ -3832,9 +3844,11 @@ _int_free (mstate av, mchunkptr p, int h
2716093
     {
2716093
       errstr = "free(): invalid pointer";
2716093
     errout:
Siddhesh Poyarekar 216cf91
-      if (!have_lock && locked)
2716093
+      if (have_lock || locked)
Siddhesh Poyarekar 216cf91
         (void) mutex_unlock (&av->mutex);
Siddhesh Poyarekar 216cf91
       malloc_printerr (check_action, errstr, chunk2mem (p));
2716093
+      if (have_lock)
2716093
+	mutex_lock(&av->mutex);
2716093
       return;
2716093
     }
e1b411d
   /* We know that each chunk is at least MINSIZE bytes in size or a
Siddhesh Poyarekar 216cf91
@@ -3981,7 +3995,7 @@ _int_free (mstate av, mchunkptr p, int h
2716093
       prevsize = p->prev_size;
2716093
       size += prevsize;
2716093
       p = chunk_at_offset(p, -((long) prevsize));
2716093
-      unlink(p, bck, fwd);
2716093
+      unlink(av, p, bck, fwd);
2716093
     }
2716093
 
2716093
     if (nextchunk != av->top) {
Siddhesh Poyarekar 216cf91
@@ -3990,7 +4004,7 @@ _int_free (mstate av, mchunkptr p, int h
2716093
 
2716093
       /* consolidate forward */
2716093
       if (!nextinuse) {
2716093
-	unlink(nextchunk, bck, fwd);
2716093
+	unlink(av, nextchunk, bck, fwd);
2716093
 	size += nextsize;
2716093
       } else
2716093
 	clear_inuse_bit_at_offset(nextchunk, 0);
Siddhesh Poyarekar 216cf91
@@ -4151,7 +4165,7 @@ static void malloc_consolidate(mstate av
2716093
 	    prevsize = p->prev_size;
2716093
 	    size += prevsize;
2716093
 	    p = chunk_at_offset(p, -((long) prevsize));
2716093
-	    unlink(p, bck, fwd);
2716093
+	    unlink(av, p, bck, fwd);
2716093
 	  }
2716093
 
2716093
 	  if (nextchunk != av->top) {
Siddhesh Poyarekar 216cf91
@@ -4159,7 +4173,7 @@ static void malloc_consolidate(mstate av
2716093
 
2716093
 	    if (!nextinuse) {
2716093
 	      size += nextsize;
2716093
-	      unlink(nextchunk, bck, fwd);
2716093
+	      unlink(av, nextchunk, bck, fwd);
2716093
 	    } else
2716093
 	      clear_inuse_bit_at_offset(nextchunk, 0);
2716093
 
Siddhesh Poyarekar 216cf91
@@ -4228,7 +4242,9 @@ _int_realloc(mstate av, mchunkptr oldp,
2716093
     {
2716093
       errstr = "realloc(): invalid old size";
2716093
     errout:
2716093
+      mutex_unlock(&av->mutex);
Siddhesh Poyarekar 216cf91
       malloc_printerr (check_action, errstr, chunk2mem (oldp));
2716093
+      mutex_lock(&av->mutex);
2716093
       return NULL;
2716093
     }
2716093
 
Siddhesh Poyarekar 216cf91
@@ -4274,7 +4290,7 @@ _int_realloc(mstate av, mchunkptr oldp,
Siddhesh Poyarekar 216cf91
                (unsigned long) (nb))
Siddhesh Poyarekar 216cf91
         {
Siddhesh Poyarekar 216cf91
           newp = oldp;
Siddhesh Poyarekar 216cf91
-          unlink (next, bck, fwd);
Siddhesh Poyarekar 216cf91
+          unlink (av, next, bck, fwd);
Siddhesh Poyarekar 216cf91
         }
2716093
 
Siddhesh Poyarekar 216cf91
       /* allocate, copy, free */