From de32435a6c4ea0732f407c62664f065995c1f665 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Thu, 31 Mar 2016 09:19:35 +0200 Subject: [PATCH] Fixed by where pspp would crash if ELSE appeared without a DO IF. Found by zzuf. --- src/language/control/do-if.c | 5 ++++- tests/language/control/do-if.at | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/language/control/do-if.c b/src/language/control/do-if.c index 6b6dc16d4d..83de0e39a3 100644 --- a/src/language/control/do-if.c +++ b/src/language/control/do-if.c @@ -124,9 +124,12 @@ int cmd_else (struct lexer *lexer UNUSED, struct dataset *ds) { struct do_if_trns *do_if = ctl_stack_top (&do_if_class); - assert (ds == do_if->ds); + if (do_if == NULL || !must_not_have_else (do_if)) return CMD_CASCADING_FAILURE; + + assert (ds == do_if->ds); + add_else (do_if); return CMD_SUCCESS; } diff --git a/tests/language/control/do-if.at b/tests/language/control/do-if.at index 2136c9b566..c4f9f0e483 100644 --- a/tests/language/control/do-if.at +++ b/tests/language/control/do-if.at @@ -58,3 +58,25 @@ AT_CHECK([pspp -O format=csv do-if.sps], [1], [dnl do-if.sps:2: error: END IF: This command cannot appear outside DO IF...END IF. ]) AT_CLEANUP + + + +AT_SETUP([ELSE without DO IF]) +AT_DATA([do-if.sps], [dnl +DATA lIST NOTABLE LIST /QUA BRA *. +BEGIN DATA +4 1 +6 3 +END DATA + +ELSE QUA 'A string'. + +EXECUTE. +]) +AT_CHECK([pspp -O format=csv do-if.sps], [1], [dnl +do-if.sps:7: error: ELSE: This command cannot appear outside DO IF...END IF. + +do-if.sps:9: error: Stopping syntax file processing here to avoid a cascade of dependent command failures. +]) +AT_CLEANUP + -- 2.30.2