about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--malloc/arena.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/malloc/arena.c b/malloc/arena.c
index b44e307ade..060eb95375 100644
--- a/malloc/arena.c
+++ b/malloc/arena.c
@@ -816,23 +816,28 @@ reused_arena (mstate avoid_arena)
     }
   while (result != next_to_use);
 
-  /* Avoid AVOID_ARENA as we have already failed to allocate memory
-     in that arena and it is currently locked.   */
+  /* Avoid AVOID_ARENA as we have already failed to allocate memory in that
+     arena.  We may however end up with AVOID_ARENA once again if it is
+     the only arena available.  */
   if (result == avoid_arena)
     result = result->next;
 
   /* Make sure that the arena we get is not corrupted.  */
   mstate begin = result;
+  bool looped = false;
+
   while (arena_is_corrupt (result) || result == avoid_arena)
     {
       result = result->next;
       if (result == begin)
-	break;
+	{
+	  looped = true;
+	  break;
+	}
     }
 
-  /* We could not find any arena that was either not corrupted or not the one
-     we wanted to avoid.  */
-  if (result == begin || result == avoid_arena)
+  /* We could not find any arena that was not corrupted.  */
+  if (looped)
     return NULL;
 
   /* No arena available without contention.  Wait for the next in line.  */