Fix malloc_info without prioor allocations.
authorUlrich Drepper <drepper@redhat.com>
Thu, 14 Jan 2010 21:32:58 +0000 (13:32 -0800)
committerUlrich Drepper <drepper@redhat.com>
Thu, 14 Jan 2010 21:32:58 +0000 (13:32 -0800)
ChangeLog
malloc/malloc.c

index 3cf70a9..db85d0c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2010-01-14  Ulrich Drepper  <drepper@redhat.com>
 
+       [BZ #11126]
+       * malloc/malloc.c (malloc_info): Initialize malloc if not already
+       done.  Handle empty bin lists.
+
        * posix/unistd.h: Change getpagesize and getdtablesize declaration
        visibility some more.
 
index ea10d17..b43e454 100644 (file)
@@ -6369,16 +6369,19 @@ malloc_info (int options, FILE *fp)
 
     mbinptr bin = bin_at (ar_ptr, 1);
     struct malloc_chunk *r = bin->fd;
-    while (r != bin)
+    if (r != NULL)
       {
-       ++sizes[NFASTBINS].count;
-       sizes[NFASTBINS].total += r->size;
-       sizes[NFASTBINS].from = MIN (sizes[NFASTBINS].from, r->size);
-       sizes[NFASTBINS].to = MAX (sizes[NFASTBINS].to, r->size);
-       r = r->fd;
+       while (r != bin)
+         {
+           ++sizes[NFASTBINS].count;
+           sizes[NFASTBINS].total += r->size;
+           sizes[NFASTBINS].from = MIN (sizes[NFASTBINS].from, r->size);
+           sizes[NFASTBINS].to = MAX (sizes[NFASTBINS].to, r->size);
+           r = r->fd;
+         }
+       nblocks += sizes[NFASTBINS].count;
+       avail += sizes[NFASTBINS].total;
       }
-    nblocks += sizes[NFASTBINS].count;
-    avail += sizes[NFASTBINS].total;
 
     for (size_t i = 2; i < NBINS; ++i)
       {
@@ -6388,17 +6391,18 @@ malloc_info (int options, FILE *fp)
        sizes[NFASTBINS - 1 + i].to = sizes[NFASTBINS - 1 + i].total
          = sizes[NFASTBINS - 1 + i].count = 0;
 
-       while (r != bin)
-         {
-           ++sizes[NFASTBINS - 1 + i].count;
-           sizes[NFASTBINS - 1 + i].total += r->size;
-           sizes[NFASTBINS - 1 + i].from = MIN (sizes[NFASTBINS - 1 + i].from,
+       if (r != NULL)
+         while (r != bin)
+           {
+             ++sizes[NFASTBINS - 1 + i].count;
+             sizes[NFASTBINS - 1 + i].total += r->size;
+             sizes[NFASTBINS - 1 + i].from
+               = MIN (sizes[NFASTBINS - 1 + i].from, r->size);
+             sizes[NFASTBINS - 1 + i].to = MAX (sizes[NFASTBINS - 1 + i].to,
                                                 r->size);
-           sizes[NFASTBINS - 1 + i].to = MAX (sizes[NFASTBINS - 1 + i].to,
-                                              r->size);
 
-           r = r->fd;
-         }
+             r = r->fd;
+           }
 
        if (sizes[NFASTBINS - 1 + i].count == 0)
          sizes[NFASTBINS - 1 + i].from = 0;
@@ -6460,6 +6464,9 @@ malloc_info (int options, FILE *fp)
     fputs ("</heap>\n", fp);
   }
 
+  if(__malloc_initialized < 0)
+    ptmalloc_init ();
+
   fputs ("<malloc version=\"1\">\n", fp);
 
   /* Iterate over all arenas currently in use.  */