From: John Darrington Date: Tue, 14 Nov 2006 12:29:25 +0000 (+0000) Subject: Fixed bug which crept in with the recent lexer changes. X-Git-Tag: v0.6.0~695 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2bad4e1d02bd2d33de548ec8cf145999700a1aa4;p=pspp-builds.git Fixed bug which crept in with the recent lexer changes. Added regression test to check for this bug. --- diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 39b674c5..b6e5fc4e 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -111,11 +111,14 @@ lex_create (bool (*read_line_func) (struct string *, bool *)) void lex_destroy (struct lexer *lexer) { - ds_destroy (&lexer->put_tokstr); - ds_destroy (&lexer->tokstr); - ds_destroy (&lexer->line_buffer); + if ( NULL != lexer ) + { + ds_destroy (&lexer->put_tokstr); + ds_destroy (&lexer->tokstr); + ds_destroy (&lexer->line_buffer); - free (lexer); + free (lexer); + } } diff --git a/tests/automake.mk b/tests/automake.mk index dde7b09c..ce528a24 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -89,6 +89,7 @@ TESTS = \ tests/bugs/match-files-scratch.sh \ tests/bugs/multipass.sh \ tests/bugs/random.sh \ + tests/bugs/signals.sh \ tests/bugs/t-test-with-temp.sh \ tests/bugs/t-test.sh \ tests/bugs/t-test-alpha.sh \ diff --git a/tests/bugs/signals.sh b/tests/bugs/signals.sh new file mode 100755 index 00000000..a08aa9a5 --- /dev/null +++ b/tests/bugs/signals.sh @@ -0,0 +1,116 @@ +#!/bin/sh + +# This program tests that signals are properly caught and handled by PSPP + +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 + + # Kill any remaining children of this shell + kill `ps h --ppid $$ | awk '{print $1}'` 2> /dev/null +} + + +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 + + +activity="run program in interactive mode" +cat | $PSPP --testing-mode -o raw-ascii 2> $TEMPDIR/stderr1 > /dev/null & +thepid1=$! +if [ $? -ne 0 ] ; then no_result ; fi + +activity="run program in interactive mode 2" +cat | $PSPP --testing-mode -o raw-ascii 2> $TEMPDIR/stderr2 > /dev/null & +thepid2=$! +if [ $? -ne 0 ] ; then no_result ; fi + +# This one is a dummy. Despite the sleep command, it may not be enought +# to ensure that the preceeding pspp has actually initialised itself. +activity="run program in interactive mode 3" +cat | $PSPP --testing-mode -o raw-ascii 2> /dev/null > /dev/null & sleep 1 +thepid3=$! +if [ $? -ne 0 ] ; then no_result ; fi + +activity="sending SIGINT to pspp1" +kill -INT $thepid1 +if [ $? -ne 0 ] ; then no_result ; fi + +activity="sending SIGSEGV to pspp2" +kill -SEGV $thepid2 +if [ $? -ne 0 ] ; then no_result ; fi + + +# SIGINT should have caused a clean shutdown + +activity="checking for absence of error messages 1" +[ ! -s $TEMPDIR/stderr1 ] +if [ $? -ne 0 ] ; then fail ; fi + +# SIGSEGV should have caused an error message + +activity="checking for error messages from pspp 2" +head -8 $TEMPDIR/stderr2 > $TEMPDIR/stderr-head +if [ $? -ne 0 ] ; then no_result ; fi + +activity="comparing error messages from pspp 2" +diff $TEMPDIR/stderr-head - << EOF +****************************************************** +You have discovered a bug in PSPP. Please report this +to bug-gnu-pspp@gnu.org. Please include this entire +message, *plus* several lines of output just above it. +For the best chance at having the bug fixed, also +include the syntax file that triggered it and a sample +of any data file used for input. +proximate cause: Segmentation Violation +EOF +if [ $? -ne 0 ] ; then fail ; fi + + +pass;