Fixed crash when processing regression with bad syntax
[pspp] / src / language / stats / oneway.c
index 08449103c522f92e834ffda095404780729614b4..9d31b4201f20ca2c0d552a110e74c2d2ff69aad9 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012, 2013 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
@@ -384,6 +384,22 @@ static void show_homogeneity (const struct oneway_spec *, const struct oneway_wo
 static void output_oneway (const struct oneway_spec *, struct oneway_workspace *ws);
 static void run_oneway (const struct oneway_spec *cmd, struct casereader *input, const struct dataset *ds);
 
+
+static void
+destroy_coeff_list (struct contrasts_node *coeff_list)
+{
+  struct coeff_node *cn = NULL;
+  struct coeff_node *cnx = NULL;
+  struct ll_list *cl = &coeff_list->coefficient_list;
+  
+  ll_for_each_safe (cn, cnx, struct coeff_node, ll, cl)
+    {
+      free (cn);
+    }
+  
+  free (coeff_list);
+}
+
 static void
 oneway_cleanup (struct oneway_spec *cmd)
 {
@@ -391,16 +407,7 @@ oneway_cleanup (struct oneway_spec *cmd)
   struct contrasts_node *coeff_next  = NULL;
   ll_for_each_safe (coeff_list, coeff_next, struct contrasts_node, ll, &cmd->contrast_list)
     {
-      struct coeff_node *cn = NULL;
-      struct coeff_node *cnx = NULL;
-      struct ll_list *cl = &coeff_list->coefficient_list;
-
-      ll_for_each_safe (cn, cnx, struct coeff_node, ll, cl)
-       {
-         free (cn);
-       }
-
-      free (coeff_list);
+      destroy_coeff_list (coeff_list);
     }
 
   free (cmd->posthoc);
@@ -529,6 +536,7 @@ cmd_oneway (struct lexer *lexer, struct dataset *ds)
                }
              else
                {
+                 destroy_coeff_list (cl);
                  lex_error (lexer, NULL);
                  goto error;
                }
@@ -628,6 +636,15 @@ makeit (const void *aux1, void *aux2 UNUSED)
   return dd;
 }
 
+static void 
+killit (const void *aux1 UNUSED, void *aux2 UNUSED, void *user_data)
+{
+  struct descriptive_data *dd = user_data;
+
+  dd_destroy (dd);
+}
+
+
 static void 
 updateit (const void *aux1, void *aux2, void *user_data,
          const struct ccase *c, double weight)
@@ -691,6 +708,7 @@ run_oneway (const struct oneway_spec *cmd,
       payload.create = makeit;
       payload.update = updateit;
       payload.calculate = NULL;
+      payload.destroy = killit;
 
       ws.vws[v].cat = categoricals_create (&inter, 1, cmd->wv,
                                            cmd->exclude, cmd->exclude);
@@ -887,6 +905,7 @@ output_oneway (const struct oneway_spec *cmd, struct oneway_workspace *ws)
               i, ll_count (cl), ws->actual_number_of_groups);
 
          ll_remove (&coeff_list->ll);
+         destroy_coeff_list (coeff_list);
          continue;
        }
 
@@ -1550,7 +1569,7 @@ show_comparisons (const struct oneway_spec *cmd, const struct oneway_workspace *
 
   tab_vline (t, TAL_2, heading_cols, 0, n_rows - 1);
 
-  tab_title (t, _("Multiple Comparisons"));
+  tab_title (t, _("Multiple Comparisons (%s)"), var_to_string (cmd->vars[v]));
 
   tab_text_format (t,  1, 1, TAB_LEFT | TAT_TITLE, _("(I) %s"), var_to_string (cmd->indep_var));
   tab_text_format (t,  2, 1, TAB_LEFT | TAT_TITLE, _("(J) %s"), var_to_string (cmd->indep_var));