d8307d
commit 91d5989356325759503311df67e750b358ef4148
d8307d
Author: Niklas Hambüchen <mail@nh2.me>
d8307d
Date:   Thu Aug 8 22:02:27 2019 +0200
d8307d
d8307d
    malloc: Fix missing accounting of top chunk in malloc_info [BZ #24026]
d8307d
    
d8307d
    Fixes `<total type="rest" size="..."> incorrectly showing as 0 most
d8307d
    of the time.
d8307d
    
d8307d
    The rest value being wrong is significant because to compute the
d8307d
    actual amount of memory handed out via malloc, the user must subtract
d8307d
    it from <system type="current" size="...">. That result being wrong
d8307d
    makes investigating memory fragmentation issues like
d8307d
    <https://bugzilla.redhat.com/show_bug.cgi?id=843478> close to
d8307d
    impossible.
d8307d
    
d8307d
    (cherry picked from commit b6d2c4475d5abc05dd009575b90556bdd3c78ad0)
d8307d
d8307d
diff --git a/malloc/malloc.c b/malloc/malloc.c
d8307d
index 4fc7f175fe42d6c6..fcf480acdaea1b86 100644
d8307d
--- a/malloc/malloc.c
d8307d
+++ b/malloc/malloc.c
d8307d
@@ -5433,6 +5433,12 @@ __malloc_info (int options, FILE *fp)
d8307d
 
d8307d
       __libc_lock_lock (ar_ptr->mutex);
d8307d
 
d8307d
+      /* Account for top chunk.  The top-most available chunk is
d8307d
+	 treated specially and is never in any bin. See "initial_top"
d8307d
+	 comments.  */
d8307d
+      avail = chunksize (ar_ptr->top);
d8307d
+      nblocks = 1;  /* Top always exists.  */
d8307d
+
d8307d
       for (size_t i = 0; i < NFASTBINS; ++i)
d8307d
 	{
d8307d
 	  mchunkptr p = fastbin (ar_ptr, i);