From: John Darrington Date: Sat, 13 Apr 2019 18:55:19 +0000 (+0200) Subject: Fix crash in gui, when T-TEST or ONEWAY while a filter is set. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d01a4986ffc8f5afa5ee7d29dd7233143b6de7ec;p=pspp Fix crash in gui, when T-TEST or ONEWAY while a filter is set. Fixes bug #54784 --- diff --git a/NEWS b/NEWS index 3f61612fdb..e535638d36 100644 --- a/NEWS +++ b/NEWS @@ -19,6 +19,9 @@ Changes from 1.2.0 to 1.3.0: * The REGRESSION command now supports the /STATISTICS=COLLIN which outputs collinearity metrics for the data. + * A bug where the GUI would crash when T-TEST was executed whilst + a filter was set has been fixed. + Changes from 1.0.1 to 1.2.0: * New experimental command SAVE DATA COLLECTION to save MDD files. diff --git a/src/data/dictionary.c b/src/data/dictionary.c index 2a5f4d83e7..427cae3669 100644 --- a/src/data/dictionary.c +++ b/src/data/dictionary.c @@ -1114,6 +1114,22 @@ dict_set_filter (struct dictionary *d, struct variable *v) assert (v == NULL || dict_contains_var (d, v)); assert (v == NULL || var_is_numeric (v)); + /* When a filter is set, we ref the dictionary. + This is because the GUI maintains a pointer + to the dict's variables, and the variables' + addresses change in the callback. */ + if (d->filter == NULL && v != NULL) + { + d = dict_ref (d); + } + + /* Deref the dict when a filter is removed. */ + if (d->filter != NULL && v == NULL) + { + assert (d->ref_cnt > 0); + dict_unref (d); + } + d->filter = v; if (d->changed) d->changed (d, d->changed_data);