aboutsummaryrefslogtreecommitdiff
path: root/malloc/Makefile
diff options
context:
space:
mode:
authorCarlos O'Donell <carlos@systemhalted.org>2017-09-28 11:05:18 -0600
committerCarlos O'Donell <carlos@systemhalted.org>2017-10-06 09:31:52 -0700
commit1e26d35193efbb29239c710a4c46a64708643320 (patch)
tree711bdaefe5af9f9566c3a9e101b7328f565faa61 /malloc/Makefile
parentd13867625894fda6c6a5034dadfa8ff86983ea12 (diff)
downloadglibc-1e26d35193efbb29239c710a4c46a64708643320.zip
glibc-1e26d35193efbb29239c710a4c46a64708643320.tar.gz
glibc-1e26d35193efbb29239c710a4c46a64708643320.tar.bz2
malloc: Fix tcache leak after thread destruction [BZ #22111]
The malloc tcache added in 2.26 will leak all of the elements remaining in the cache and the cache structure itself when a thread exits. The defect is that we do not set tcache_shutting_down early enough, and the thread simply recreates the tcache and places the elements back onto a new tcache which is subsequently lost as the thread exits (unfreed memory). The fix is relatively simple, move the setting of tcache_shutting_down earlier in tcache_thread_freeres. We add a test case which uses mallinfo and some heuristics to look for unaccounted for memory usage between the start and end of a thread start/join loop. It is very reliable at detecting that there is a leak given the number of iterations. Without the fix the test will consume 122MiB of leaked memory.
Diffstat (limited to 'malloc/Makefile')
-rw-r--r--malloc/Makefile3
1 files changed, 3 insertions, 0 deletions
diff --git a/malloc/Makefile b/malloc/Makefile
index 50b487e..6cf78e1 100644
--- a/malloc/Makefile
+++ b/malloc/Makefile
@@ -34,6 +34,7 @@ tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \
tst-interpose-nothread \
tst-interpose-thread \
tst-alloc_buffer \
+ tst-malloc-tcache-leak \
tests-static := \
tst-interpose-static-nothread \
@@ -242,3 +243,5 @@ tst-dynarray-fail-ENV = MALLOC_TRACE=$(objpfx)tst-dynarray-fail.mtrace
$(objpfx)tst-dynarray-fail-mem.out: $(objpfx)tst-dynarray-fail.out
$(common-objpfx)malloc/mtrace $(objpfx)tst-dynarray-fail.mtrace > $@; \
$(evaluate-test)
+
+$(objpfx)tst-malloc-tcache-leak: $(shared-thread-library)