=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/doas/parse.y,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- src/usr.bin/doas/parse.y 2021/01/27 17:02:50 1.29 +++ src/usr.bin/doas/parse.y 2021/11/30 20:08:15 1.30 @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.29 2021/01/27 17:02:50 millert Exp $ */ +/* $OpenBSD: parse.y,v 1.30 2021/11/30 20:08:15 tobias Exp $ */ /* * Copyright (c) 2015 Ted Unangst * @@ -18,6 +18,7 @@ %{ #include #include +#include #include #include #include @@ -39,8 +40,8 @@ const char **strlist; const char *str; }; - int lineno; - int colno; + unsigned long lineno; + unsigned long colno; } yystype; #define YYSTYPE yystype @@ -50,7 +51,7 @@ size_t nrules; static size_t maxrules; -int parse_errors = 0; +int parse_error = 0; static void yyerror(const char *, ...); static int yylex(void); @@ -198,8 +199,8 @@ va_start(va, fmt); vfprintf(stderr, fmt, va); va_end(va); - fprintf(stderr, " at line %d\n", yylval.lineno + 1); - parse_errors++; + fprintf(stderr, " at line %lu\n", yylval.lineno + 1); + parse_error = 1; } static struct keyword { @@ -222,7 +223,8 @@ yylex(void) { char buf[1024], *ebuf, *p, *str; - int c, quotes = 0, escape = 0, qpos = -1, nonkw = 0; + int c, quoted = 0, quotes = 0, qerr = 0, escape = 0, nonkw = 0; + unsigned long qpos = 0; size_t i; p = buf; @@ -258,7 +260,7 @@ for (;; c = getc(yyfp), yylval.colno++) { switch (c) { case '\0': - yyerror("unallowed character NUL in column %d", + yyerror("unallowed character NUL in column %lu", yylval.colno + 1); escape = 0; continue; @@ -268,26 +270,27 @@ continue; break; case '\n': - if (quotes) - yyerror("unterminated quotes in column %d", + if (quotes && !qerr) { + yyerror("unterminated quotes in column %lu", qpos + 1); + qerr = 1; + } if (escape) { nonkw = 1; escape = 0; - yylval.colno = 0; + yylval.colno = ULONG_MAX; yylval.lineno++; continue; } goto eow; case EOF: if (escape) - yyerror("unterminated escape in column %d", + yyerror("unterminated escape in column %lu", yylval.colno); - if (quotes) - yyerror("unterminated quotes in column %d", + if (quotes && !qerr) + yyerror("unterminated quotes in column %lu", qpos + 1); goto eow; - /* FALLTHROUGH */ case '{': case '}': case '#': @@ -298,9 +301,11 @@ break; case '"': if (!escape) { + quoted = 1; quotes = !quotes; if (quotes) { nonkw = 1; + qerr = 0; qpos = yylval.colno; } continue; @@ -326,7 +331,7 @@ */ if (c == EOF) goto eof; - else if (qpos == -1) /* accept, e.g., empty args: cmd foo args "" */ + else if (!quoted) /* accept, e.g., empty args: cmd foo args "" */ goto repeat; } if (!nonkw) {