EXAMINE: Fix memory leak in box-whisker plots.
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 21 Feb 2016 05:38:38 +0000 (21:38 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 21 Feb 2016 05:38:38 +0000 (21:38 -0800)
Found by valgrind.
Reported by John Darrington.
Bug #47074.

src/language/stats/examine.c

index 295fca1a4a7b2d8a7d7cc9a8595767ad1ac6626d..dc0d6c5beecfe4a160105e3fbbf2729631c5c7bd 100644 (file)
@@ -1,6 +1,6 @@
 /*
   PSPP - a program for statistical analysis.
-  Copyright (C) 2012, 2013  Free Software Foundation, Inc.
+  Copyright (C) 2012, 2013, 2016  Free Software Foundation, Inc.
   
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -298,7 +298,7 @@ show_boxplot_grouped (const struct examine *cmd, int iact_idx)
           const struct ccase *c =
             categoricals_get_case_by_category_real (cmd->cats,  iact_idx, grp);
 
-          const struct exploratory_stats *es =
+          struct exploratory_stats *es =
             categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, grp);
 
           ds_init_empty (&label);
@@ -320,6 +320,7 @@ show_boxplot_grouped (const struct examine *cmd, int iact_idx)
             }
 
           boxplot_add_box (boxplot, es[v].box_whisker, ds_cstr (&label));
+          es[v].box_whisker = NULL;
 
           ds_destroy (&label);
         }
@@ -390,11 +391,12 @@ show_boxplot_variabled (const struct examine *cmd, int iact_idx)
 
       for (v = 0; v < cmd->n_dep_vars; ++v)
         {
-          const struct exploratory_stats *es =
+          struct exploratory_stats *es =
             categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, grp);
 
           boxplot_add_box (boxplot, es[v].box_whisker, 
                            var_to_string (cmd->dep_vars[v]));
+          es[v].box_whisker = NULL;
         }
 
       boxplot_submit (boxplot);
@@ -1796,6 +1798,12 @@ cleanup_exploratory_stats (struct examine *cmd)
              statistic_destroy (&es[v].histogram->parent);
              moments_destroy (es[v].mom);
 
+              if (es[v].box_whisker)
+                {
+                  stat = &es[v].box_whisker->parent.parent;
+                  stat->destroy (stat);
+                }
+
              casereader_destroy (es[v].sorted_reader);
            }
        }