From 032ac72de5fd6041c0568263d8d376a2a2bed6fd Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sun, 29 Mar 2009 12:05:09 +0800 Subject: [PATCH] Fix crash running two consecutive examine commands. Re-initialise list in the dynamically instead of relying on the static initialiser. Fixes bug #25903 --- src/language/stats/examine.q | 4 +- tests/automake.mk | 1 + tests/bugs/examine-crash2.sh | 81 ++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100755 tests/bugs/examine-crash2.sh diff --git a/src/language/stats/examine.q b/src/language/stats/examine.q index 78ea0e63..2649968b 100644 --- a/src/language/stats/examine.q +++ b/src/language/stats/examine.q @@ -198,7 +198,7 @@ factor_destroy (struct xfactor *fctr) } static struct xfactor level0_factor; -static struct ll_list factor_list = LL_INITIALIZER (factor_list); +static struct ll_list factor_list; /* Parse the clause specifying the factors */ static int examine_parse_independent_vars (struct lexer *lexer, @@ -268,6 +268,8 @@ cmd_examine (struct lexer *lexer, struct dataset *ds) subc_list_double_create (&percentile_list); percentile_algorithm = PC_HAVERAGE; + ll_init (&factor_list); + if ( !parse_examine (lexer, ds, &cmd, NULL) ) { subc_list_double_destroy (&percentile_list); diff --git a/tests/automake.mk b/tests/automake.mk index f1bb6306..5c84354f 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -116,6 +116,7 @@ dist_TESTS = \ tests/bugs/empty-do-repeat.sh \ tests/bugs/get.sh \ tests/bugs/examine-crash.sh \ + tests/bugs/examine-crash2.sh \ tests/bugs/examine-1sample.sh \ tests/bugs/examine-missing.sh \ tests/bugs/examine-missing2.sh \ diff --git a/tests/bugs/examine-crash2.sh b/tests/bugs/examine-crash2.sh new file mode 100755 index 00000000..01fe8f9a --- /dev/null +++ b/tests/bugs/examine-crash2.sh @@ -0,0 +1,81 @@ +#!/bin/sh + +# This program tests for a bug which crashed pspp +# when two consecutive EXAMINE commands are run. + +TEMPDIR=/tmp/pspp-tst-$$ +TESTFILE=$TEMPDIR/`basename $0`.sps + +# ensure that top_srcdir and top_builddir are absolute +if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi +if [ -z "$top_builddir" ] ; then top_builddir=. ; fi +top_srcdir=`cd $top_srcdir; pwd` +top_builddir=`cd $top_builddir; pwd` + +PSPP=$top_builddir/src/ui/terminal/pspp + +STAT_CONFIG_PATH=$top_srcdir/config +export STAT_CONFIG_PATH + +LANG=C +export LANG + + +cleanup() +{ + if [ x"$PSPP_TEST_NO_CLEANUP" != x ] ; then + echo "NOT cleaning $TEMPDIR" + return ; + fi + rm -rf $TEMPDIR +} + + +fail() +{ + echo $activity + echo FAILED + cleanup; + exit 1; +} + + +no_result() +{ + echo $activity + echo NO RESULT; + cleanup; + exit 2; +} + +pass() +{ + cleanup; + exit 0; +} + +mkdir -p $TEMPDIR + +cd $TEMPDIR + +cat < $TESTFILE +data list list /y * z *. +begin data. +6 4 +5 3 +7 6 +end data. + +EXAMINE /VARIABLES= z BY y. + +EXAMINE /VARIABLES= z. +EOF +if [ $? -ne 0 ] ; then no_result ; fi + + +activity="run program" +$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +if [ $? -ne 0 ] ; then fail ; fi + + +pass; -- 2.30.2