aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--awk.h1
-rw-r--r--awkgram.c2
-rw-r--r--awkgram.y2
-rw-r--r--command.c14
-rw-r--r--command.y14
-rw-r--r--main.c6
-rw-r--r--test/ChangeLog2
-rw-r--r--test/Makefile.am4
-rw-r--r--test/Makefile.in9
-rw-r--r--test/Maketests5
-rw-r--r--test/synerr3.awk1
-rw-r--r--test/synerr3.ok5
13 files changed, 54 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 582aa91b..b18a7ba6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,13 @@
* Makefile.am (EXTRA_DIST): Add ChangeLog.1 to the list. Ooops.
* CheckList: Updated.
+ Fix core dump reported by Steve Kemp <steve@steve.org.uk>:
+
+ * awk.h (errcount): Declare.
+ * awkgram.y (errcount): No longer static.
+ * command.y (dbg_errcount): Renamed from errcount.j
+ * main.c (catchsig, catchsegv): If errcount > 0, just exit,
+ don't abort.
2019-04-12 Arnold D. Robbins <arnold@skeeve.com>
* configure.ac: Update version to 5.0.0.
diff --git a/awk.h b/awk.h
index 2d87d5af..19a5eb5f 100644
--- a/awk.h
+++ b/awk.h
@@ -1116,6 +1116,7 @@ extern NODE *Null_field;
extern NODE **fields_arr;
extern int sourceline;
extern char *source;
+extern int errcount;
extern int (*interpret)(INSTRUCTION *); /* interpreter routine */
extern NODE *(*make_number)(double); /* double instead of AWKNUM on purpose */
extern NODE *(*str2number)(NODE *);
diff --git a/awkgram.c b/awkgram.c
index a568f5da..150cfdc9 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -198,7 +198,7 @@ static int continue_allowed; /* kludge for continue */
static char *tokstart = NULL;
static char *tok = NULL;
static char *tokend;
-static int errcount = 0;
+int errcount = 0;
extern char *source;
extern int sourceline;
diff --git a/awkgram.y b/awkgram.y
index 87570dfa..08bd096e 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -154,7 +154,7 @@ static int continue_allowed; /* kludge for continue */
static char *tokstart = NULL;
static char *tok = NULL;
static char *tokend;
-static int errcount = 0;
+int errcount = 0;
extern char *source;
extern int sourceline;
diff --git a/command.c b/command.c
index 16c99673..87211ee7 100644
--- a/command.c
+++ b/command.c
@@ -94,7 +94,7 @@ static bool want_nodeval = false;
static int cmd_idx = -1; /* index of current command in cmd table */
static int repeat_idx = -1; /* index of last repeatable command in command table */
static CMDARG *arg_list = NULL; /* list of arguments */
-static long errcount = 0;
+static long dbg_errcount = 0;
static char *lexptr_begin = NULL;
static bool in_commands = false;
static int num_dim;
@@ -1553,7 +1553,7 @@ yyreduce:
case 5:
#line 130 "command.y" /* yacc.c:1652 */
{
- if (errcount == 0 && cmd_idx >= 0) {
+ if (dbg_errcount == 0 && cmd_idx >= 0) {
Func_cmd cmdfunc;
bool terminate = false;
CMDARG *args;
@@ -1621,7 +1621,7 @@ yyreduce:
case 23:
#line 219 "command.y" /* yacc.c:1652 */
{
- if (errcount == 0) {
+ if (dbg_errcount == 0) {
/* don't free arg_list; passed on to statement_list
* non-terminal (empty rule action). See below.
*/
@@ -1788,7 +1788,7 @@ yyreduce:
if (yyvsp[0] != NULL)
num = yyvsp[0]->a_int;
- if (errcount != 0)
+ if (dbg_errcount != 0)
;
else if (in_commands)
yyerror(_("Can't use command `commands' for breakpoint/watchpoint commands"));
@@ -2774,7 +2774,7 @@ yyerror(const char *mesg, ...)
vfprintf(out_fp, mesg, args);
fprintf(out_fp, "\n");
va_end(args);
- errcount++;
+ dbg_errcount++;
repeat_idx = -1;
}
@@ -2796,9 +2796,9 @@ yylex(void)
yylval = (CMDARG *) NULL;
- if (errcount > 0 && lexptr_begin == NULL) {
+ if (dbg_errcount > 0 && lexptr_begin == NULL) {
/* fake a new line */
- errcount = 0;
+ dbg_errcount = 0;
return '\n';
}
diff --git a/command.y b/command.y
index 1af3ad12..6d2c9ef2 100644
--- a/command.y
+++ b/command.y
@@ -44,7 +44,7 @@ static bool want_nodeval = false;
static int cmd_idx = -1; /* index of current command in cmd table */
static int repeat_idx = -1; /* index of last repeatable command in command table */
static CMDARG *arg_list = NULL; /* list of arguments */
-static long errcount = 0;
+static long dbg_errcount = 0;
static char *lexptr_begin = NULL;
static bool in_commands = false;
static int num_dim;
@@ -128,7 +128,7 @@ line
: nls
| command nls
{
- if (errcount == 0 && cmd_idx >= 0) {
+ if (dbg_errcount == 0 && cmd_idx >= 0) {
Func_cmd cmdfunc;
bool terminate = false;
CMDARG *args;
@@ -217,7 +217,7 @@ set_want_nodeval
eval_prologue
: D_EVAL set_want_nodeval opt_param_list nls
{
- if (errcount == 0) {
+ if (dbg_errcount == 0) {
/* don't free arg_list; passed on to statement_list
* non-terminal (empty rule action). See below.
*/
@@ -335,7 +335,7 @@ command
if ($2 != NULL)
num = $2->a_int;
- if (errcount != 0)
+ if (dbg_errcount != 0)
;
else if (in_commands)
yyerror(_("Can't use command `commands' for breakpoint/watchpoint commands"));
@@ -1017,7 +1017,7 @@ yyerror(const char *mesg, ...)
vfprintf(out_fp, mesg, args);
fprintf(out_fp, "\n");
va_end(args);
- errcount++;
+ dbg_errcount++;
repeat_idx = -1;
}
@@ -1039,9 +1039,9 @@ yylex(void)
yylval = (CMDARG *) NULL;
- if (errcount > 0 && lexptr_begin == NULL) {
+ if (dbg_errcount > 0 && lexptr_begin == NULL) {
/* fake a new line */
- errcount = 0;
+ dbg_errcount = 0;
return '\n';
}
diff --git a/main.c b/main.c
index d6e34266..8327cc74 100644
--- a/main.c
+++ b/main.c
@@ -1262,6 +1262,9 @@ catchsig(int sig)
|| sig == SIGBUS
#endif
) {
+ if (errcount > 0) // assume a syntax error corrupted our data structures
+ exit(EXIT_FATAL);
+
set_loc(__FILE__, __LINE__);
msg(_("fatal error: internal error"));
/* fatal won't abort() if not compiled for debugging */
@@ -1279,6 +1282,9 @@ catchsig(int sig)
static int
catchsegv(void *fault_address, int serious)
{
+ if (errcount > 0) // assume a syntax error corrupted our data structures
+ exit(EXIT_FATAL);
+
set_loc(__FILE__, __LINE__);
msg(_("fatal error: internal error: segfault"));
fflush(NULL);
diff --git a/test/ChangeLog b/test/ChangeLog
index ef4f632c..a6398975 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,6 +1,8 @@
2019-04-18 Arnold D. Robbins <arnold@skeeve.com>
* Makefile.am (EXTRA_DIST): Add ChangeLog.1 to the list. Ooops.
+ (synerr3): New test.
+ * synerr3.awk, synerr3.ok: New files.
2019-04-12 Arnold D. Robbins <arnold@skeeve.com>
diff --git a/test/Makefile.am b/test/Makefile.am
index a7e972af..8c794d62 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1188,6 +1188,8 @@ EXTRA_DIST = \
synerr1.ok \
synerr2.awk \
synerr2.ok \
+ synerr3.awk \
+ synerr3.ok \
tailrecurse.awk \
tailrecurse.ok \
testext.ok \
@@ -1311,7 +1313,7 @@ BASIC_TESTS = \
scalar sclforin sclifin setrec0 setrec1 \
sigpipe1 sortempty sortglos spacere splitargv splitarr \
splitdef splitvar splitwht status-close strcat1 strnum1 strnum2 strtod \
- subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 \
+ subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 synerr3 \
tailrecurse tradanch trailbs tweakfld \
uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs uplus \
wideidx wideidx2 widesub widesub2 widesub3 widesub4 wjposer1 \
diff --git a/test/Makefile.in b/test/Makefile.in
index 305277e3..ee821c9a 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -1447,6 +1447,8 @@ EXTRA_DIST = \
synerr1.ok \
synerr2.awk \
synerr2.ok \
+ synerr3.awk \
+ synerr3.ok \
tailrecurse.awk \
tailrecurse.ok \
testext.ok \
@@ -1570,7 +1572,7 @@ BASIC_TESTS = \
scalar sclforin sclifin setrec0 setrec1 \
sigpipe1 sortempty sortglos spacere splitargv splitarr \
splitdef splitvar splitwht status-close strcat1 strnum1 strnum2 strtod \
- subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 \
+ subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 synerr3 \
tailrecurse tradanch trailbs tweakfld \
uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs uplus \
wideidx wideidx2 widesub widesub2 widesub3 widesub4 wjposer1 \
@@ -3841,6 +3843,11 @@ synerr2:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+synerr3:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
tailrecurse:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index e557cb2b..dadba2ee 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -1104,6 +1104,11 @@ synerr2:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+synerr3:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
tailrecurse:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/synerr3.awk b/test/synerr3.awk
new file mode 100644
index 00000000..49b9e30a
--- /dev/null
+++ b/test/synerr3.awk
@@ -0,0 +1 @@
+for (i = ) in foo bar baz
diff --git a/test/synerr3.ok b/test/synerr3.ok
new file mode 100644
index 00000000..b8b9dd89
--- /dev/null
+++ b/test/synerr3.ok
@@ -0,0 +1,5 @@
+gawk: synerr3.awk:1: for (i = ) in foo bar baz
+gawk: synerr3.awk:1: ^ syntax error
+gawk: synerr3.awk:1: for (i = ) in foo bar baz
+gawk: synerr3.awk:1: ^ syntax error
+EXIT CODE: 2