]> git.armaanb.net Git - opendoas.git/blobdiff - parse.y
Handle empty argv
[opendoas.git] / parse.y
diff --git a/parse.y b/parse.y
index e4a041a374164133761a77c8f3f1e27f09c7556a..b5ba234db7e3f6f1f3abf1e90c1eaf74ddd2b53d 100644 (file)
--- a/parse.y
+++ b/parse.y
@@ -16,6 +16,8 @@
  */
 
 %{
+#include "config.h"
+
 #include <sys/types.h>
 #include <ctype.h>
 #include <err.h>
@@ -50,8 +52,8 @@ typedef struct {
 FILE *yyfp;
 
 struct rule **rules;
-int nrules;
-static int maxrules;
+size_t nrules;
+static size_t maxrules;
 
 int parse_errors = 0;
 
@@ -73,7 +75,7 @@ arraylen(const char **arr)
 %}
 
 %token TPERMIT TDENY TAS TCMD TARGS
-%token TNOPASS TPERSIST TKEEPENV TSETENV
+%token TNOPASS TNOLOG TPERSIST TKEEPENV TSETENV TINSULT
 %token TSTRING
 
 %%
@@ -98,12 +100,12 @@ rule:              action ident target cmd {
                        r->cmdargs = $4.cmdargs;
                        if (nrules == maxrules) {
                                if (maxrules == 0)
-                                       maxrules = 63;
-                               else
-                                       maxrules *= 2;
-                               if (!(rules = reallocarray(rules, maxrules,
-                                   sizeof(*rules))))
+                                       maxrules = 32;
+                               rules = reallocarray(rules, maxrules,
+                                   2 * sizeof(*rules));
+                               if (!rules)
                                        errx(1, "can't allocate rules");
+                               maxrules *= 2;
                        }
                        rules[nrules++] = r;
                } ;
@@ -139,12 +141,18 @@ options:  /* none */ {
 option:                TNOPASS {
                        $$.options = NOPASS;
                        $$.envlist = NULL;
+               } | TNOLOG {
+                       $$.options = NOLOG;
+                       $$.envlist = NULL;
                } | TPERSIST {
                        $$.options = PERSIST;
                        $$.envlist = NULL;
                } | TKEEPENV {
                        $$.options = KEEPENV;
                        $$.envlist = NULL;
+               } | TINSULT {
+                       $$.options = INSULT;
+                       $$.envlist = NULL;
                } | TSETENV '{' strlist '}' {
                        $$.options = 0;
                        $$.envlist = $3.strlist;
@@ -212,9 +220,11 @@ static struct keyword {
        { "cmd", TCMD },
        { "args", TARGS },
        { "nopass", TNOPASS },
+       { "nolog", TNOLOG },
        { "persist", TPERSIST },
        { "keepenv", TKEEPENV },
        { "setenv", TSETENV },
+       { "insult", TINSULT },
 };
 
 int
@@ -222,6 +232,7 @@ yylex(void)
 {
        char buf[1024], *ebuf, *p, *str;
        int c, quotes = 0, escape = 0, qpos = -1, nonkw = 0;
+       size_t i;
 
        p = buf;
        ebuf = buf + sizeof(buf);
@@ -244,12 +255,12 @@ repeat:
                        /* skip comments; NUL is allowed; no continuation */
                        while ((c = getc(yyfp)) != '\n')
                                if (c == EOF)
-                                       return 0;
+                                       goto eof;
                        yylval.colno = 0;
                        yylval.lineno++;
                        return c;
                case EOF:
-                       return 0;
+                       goto eof;
        }
 
        /* parsing next word */
@@ -272,6 +283,8 @@ repeat:
                        if (escape) {
                                nonkw = 1;
                                escape = 0;
+                               yylval.colno = 0;
+                               yylval.lineno++;
                                continue;
                        }
                        goto eow;
@@ -303,8 +316,10 @@ repeat:
                        }
                }
                *p++ = c;
-               if (p == ebuf)
+               if (p == ebuf) {
                        yyerror("too long line");
+                       p = buf;
+               }
                escape = 0;
        }
 
@@ -319,12 +334,11 @@ eow:
                 * the main loop.
                 */
                if (c == EOF)
-                       return 0;
+                       goto eof;
                else if (qpos == -1)    /* accept, e.g., empty args: cmd foo args "" */
                        goto repeat;
        }
        if (!nonkw) {
-               size_t i;
                for (i = 0; i < sizeof(keywords) / sizeof(keywords[0]); i++) {
                        if (strcmp(buf, keywords[i].word) == 0)
                                return keywords[i].token;
@@ -334,4 +348,9 @@ eow:
                err(1, "%s", __func__);
        yylval.str = str;
        return TSTRING;
+
+eof:
+       if (ferror(yyfp))
+               yyerror("input error reading config");
+       return 0;
 }