aboutsummaryrefslogtreecommitdiff
path: root/malloc/malloc.c
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2015-10-28 19:32:46 +0100
committerFlorian Weimer <fweimer@redhat.com>2015-10-28 21:29:23 +0100
commita62719ba90e2fa1728890ae7dc8df9e32a622e7b (patch)
tree27408968ee32da2b27effd96bce95fd93c399208 /malloc/malloc.c
parent0b9af583a5c2d68085e88cece13952bf05dc4882 (diff)
downloadglibc-a62719ba90e2fa1728890ae7dc8df9e32a622e7b.zip
glibc-a62719ba90e2fa1728890ae7dc8df9e32a622e7b.tar.gz
glibc-a62719ba90e2fa1728890ae7dc8df9e32a622e7b.tar.bz2
malloc: Prevent arena free_list from turning cyclic [BZ #19048]
[BZ# 19048] * malloc/malloc.c (struct malloc_state): Update comment. Add attached_threads member. (main_arena): Initialize attached_threads. * malloc/arena.c (list_lock): Update comment. (ptmalloc_lock_all, ptmalloc_unlock_all): Likewise. (ptmalloc_unlock_all2): Reinitialize arena reference counts. (deattach_arena): New function. (_int_new_arena): Initialize arena reference count and deattach replaced arena. (get_free_list, reused_arena): Update reference count and deattach replaced arena. (arena_thread_freeres): Update arena reference count and only put unreferenced arenas on the free list.
Diffstat (limited to 'malloc/malloc.c')
-rw-r--r--malloc/malloc.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 9371b5a..35c8863 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -1709,9 +1709,15 @@ struct malloc_state
/* Linked list */
struct malloc_state *next;
- /* Linked list for free arenas. */
+ /* Linked list for free arenas. Access to this field is serialized
+ by list_lock in arena.c. */
struct malloc_state *next_free;
+ /* Number of threads attached to this arena. 0 if the arena is on
+ the free list. Access to this field is serialized by list_lock
+ in arena.c. */
+ INTERNAL_SIZE_T attached_threads;
+
/* Memory allocated from the system in this arena. */
INTERNAL_SIZE_T system_mem;
INTERNAL_SIZE_T max_system_mem;
@@ -1755,7 +1761,8 @@ struct malloc_par
static struct malloc_state main_arena =
{
.mutex = MUTEX_INITIALIZER,
- .next = &main_arena
+ .next = &main_arena,
+ .attached_threads = 1
};
/* There is only one instance of the malloc parameters. */