Fix one of the leaks in ONEWAY
[pspp] / src / language / stats / oneway.c
index 5ea77473720b6c34a7149ae252508ccd523805a6..4ac917bd5d883a2a20561a2ddd53e4f77d31aae5 100644 (file)
@@ -384,6 +384,28 @@ 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
+oneway_cleanup (struct oneway_spec *cmd)
+{
+  struct contrasts_node *coeff_list  = NULL;
+  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);
+    }
+}
+
+
+
 int
 cmd_oneway (struct lexer *lexer, struct dataset *ds)
 {
@@ -560,10 +582,12 @@ cmd_oneway (struct lexer *lexer, struct dataset *ds)
     ok = proc_commit (ds) && ok;
   }
 
+  oneway_cleanup (&oneway);
   free (oneway.vars);
   return CMD_SUCCESS;
 
  error:
+  oneway_cleanup (&oneway);
   free (oneway.vars);
   return CMD_FAILURE;
 }
@@ -664,9 +688,10 @@ run_oneway (const struct oneway_spec *cmd,
       struct payload payload;
       payload.create = makeit;
       payload.update = updateit;
+      payload.destroy = NULL;
 
       ws.vws[v].cat = categoricals_create (&inter, 1, cmd->wv,
-                                           cmd->exclude);
+                                           cmd->exclude, cmd->exclude);
 
       categoricals_set_payload (ws.vws[v].cat, &payload, 
                                CONST_CAST (struct variable *, cmd->vars[v]),
@@ -823,6 +848,7 @@ run_oneway (const struct oneway_spec *cmd,
   taint_destroy (taint);
 
  finish:
+
   for (v = 0; v < cmd->n_vars; ++v)
     {
       covariance_destroy (ws.vws[v].cov);