From ab057ea64a9d4f712a537d183bbdc04d2bb24fbe Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sun, 12 Aug 2012 13:33:09 +0200 Subject: [PATCH] Fix memory leaks in ONEWAY command --- src/language/stats/examine.c | 1 + src/language/stats/means.c | 2 ++ src/language/stats/oneway.c | 10 ++++++++++ src/math/categoricals.c | 4 +--- src/math/categoricals.h | 1 + 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/language/stats/examine.c b/src/language/stats/examine.c index 4e4790eb32..46b27f9d36 100644 --- a/src/language/stats/examine.c +++ b/src/language/stats/examine.c @@ -1804,6 +1804,7 @@ run_examine (struct examine *cmd, struct casereader *input) payload.create = create_n; payload.update = update_n; payload.calculate = calculate_n; + payload.destroy = NULL; cmd->wv = dict_get_weight (cmd->dict); diff --git a/src/language/stats/means.c b/src/language/stats/means.c index fec2087739..c67d75002f 100644 --- a/src/language/stats/means.c +++ b/src/language/stats/means.c @@ -1,3 +1,4 @@ + /* PSPP - a program for statistical analysis. Copyright (C) 2011, 2012 Free Software Foundation, Inc. @@ -939,6 +940,7 @@ run_means (struct means *cmd, struct casereader *input, payload.create = create_n; payload.update = update_n; payload.calculate = calculate_n; + payload.destroy = NULL; for (t = 0; t < cmd->n_tables; ++t) { diff --git a/src/language/stats/oneway.c b/src/language/stats/oneway.c index 08449103c5..2a412a3d7e 100644 --- a/src/language/stats/oneway.c +++ b/src/language/stats/oneway.c @@ -628,6 +628,15 @@ makeit (const void *aux1, void *aux2 UNUSED) return dd; } +static void +killit (const void *aux1 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 +700,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); diff --git a/src/math/categoricals.c b/src/math/categoricals.c index 7eaf82195b..43edd048dc 100644 --- a/src/math/categoricals.c +++ b/src/math/categoricals.c @@ -253,10 +253,8 @@ categoricals_destroy (struct categoricals *cat) /* Interate over each interaction value, and unref any cases that we reffed */ HMAP_FOR_EACH (iv, struct interaction_value, node, &cat->iap[i].ivmap) { -#if 0 - if (cat->payload) + if (cat->payload && cat->payload->destroy) cat->payload->destroy (cat->aux1, iv->user_data); -#endif case_unref (iv->ccase); } diff --git a/src/math/categoricals.h b/src/math/categoricals.h index 11d64d0229..3fa6c36d90 100644 --- a/src/math/categoricals.h +++ b/src/math/categoricals.h @@ -107,6 +107,7 @@ struct payload void* (*create) (const void *aux1, void *aux2); void (*update) (const void *aux1, void *aux2, void *user_data, const struct ccase *, double weight); void (*calculate) (const void *aux1, void *aux2, void *user_data); + void (*destroy) (const void *aux1, void *user_data); }; -- 2.30.2