rts: Properly free the RTSSummaryStats structure
authorÖmer Sinan Ağacan <omeragacan@gmail.com>
Wed, 1 May 2019 15:40:33 +0000 (18:40 +0300)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Sat, 4 May 2019 00:50:03 +0000 (20:50 -0400)
`stat_exit` always allocates a `RTSSummaryStats` but only sometimes
frees it, which casues leaks. With this patch we unconditionally free
the structure, fixing the leak.

Fixes #16584

rts/Stats.c

index b2e48c4..461eb76 100644 (file)
@@ -657,11 +657,8 @@ static void init_RTSSummaryStats(RTSSummaryStats* sum)
 
 static void free_RTSSummaryStats(RTSSummaryStats * sum)
 {
 
 static void free_RTSSummaryStats(RTSSummaryStats * sum)
 {
-    if (!sum) { return; }
-    if (!sum->gc_summary_stats) {
-        stgFree(sum->gc_summary_stats);
-        sum->gc_summary_stats = NULL;
-    }
+    stgFree(sum->gc_summary_stats);
+    sum->gc_summary_stats = NULL;
 }
 
 static void report_summary(const RTSSummaryStats* sum)
 }
 
 static void report_summary(const RTSSummaryStats* sum)
@@ -1257,11 +1254,12 @@ stat_exit (void)
             }
         }
 
             }
         }
 
-        free_RTSSummaryStats(&sum);
         statsFlush();
         statsClose();
     }
 
         statsFlush();
         statsClose();
     }
 
+    free_RTSSummaryStats(&sum);
+
     if (GC_coll_cpu) {
       stgFree(GC_coll_cpu);
       GC_coll_cpu = NULL;
     if (GC_coll_cpu) {
       stgFree(GC_coll_cpu);
       GC_coll_cpu = NULL;