From: Todd C. Miller Date: Tue, 11 Dec 2001 23:05:44 +0000 (+0000) Subject: o Use exclusive start conditions to remove some ambiguity in the X-Git-Tag: SUDO_1_6_4~135 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cf2db3682bbe7f80f74a71ca1b5330f61dcd2dd9;p=sudo o Use exclusive start conditions to remove some ambiguity in the lexer. Also reorder some things for clarity. o Add support for "+=" and "-=" list operators. o Use the new DEFVAR token to denote a Defaults variable name. --- diff --git a/parse.lex b/parse.lex index 12e13c490..d712a3d56 100644 --- a/parse.lex +++ b/parse.lex @@ -1,6 +1,6 @@ %{ /* - * Copyright (c) 1996, 1998, 1999 Todd C. Miller + * Copyright (c) 1996, 1998-2001 Todd C. Miller * All rights reserved. * * This code is derived from software contributed by Chris Jepeway @@ -59,7 +59,7 @@ #include #include "sudo.h" #include "parse.h" -#include "sudo.tab.h" +#include #ifndef lint static const char rcsid[] = "$Sudo$"; @@ -94,85 +94,107 @@ OCTET (1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]) DOTTEDQUAD {OCTET}(\.{OCTET}){3} HOSTNAME [[:alnum:]_-]+ WORD ([^@!=:,\(\) \t\n\\]|\\[^\n])+ +DEFVAR [a-z_]+ -%s GOTCMND +/* XXX - convert GOTRUNAS to exclusive state (GOTDEFS cannot be) */ %s GOTRUNAS %s GOTDEFS +%x GOTCMND +%x STARTDEFS +%x INDEFS %% -[ \t]+ { /* throw away space/tabs */ - sawspace = TRUE; /* but remember for fill_args */ +[[:blank:]]+ BEGIN STARTDEFS; + +{DEFVAR} { + BEGIN INDEFS; + LEXTRACE("DEFVAR "); + fill(yytext, yyleng); + return(DEFVAR); } -\\[ \t]*\n { - sawspace = TRUE; /* remember for fill_args */ - ++sudolineno; - LEXTRACE("\n\t"); - } /* throw away EOL after \ */ +{ + , { + BEGIN STARTDEFS; + LEXTRACE(", "); + return(','); + } /* return ',' */ -\\[:\,=\\ \t#] { - LEXTRACE("QUOTEDCHAR "); - fill_args(yytext + 1, 1, sawspace); - sawspace = FALSE; - } + = { + LEXTRACE("= "); + return('='); + } /* return '=' */ -\"([^\"]|\\\")+\" { + \+= { + LEXTRACE("+= "); + return('+'); + } /* return '+' */ + + -= { + LEXTRACE("-= "); + return('-'); + } /* return '-' */ + + \"([^\"]|\\\")+\" { LEXTRACE("WORD(1) "); fill(yytext + 1, yyleng - 2); return(WORD); } +} -(#.*)?\n { - BEGIN INITIAL; - ++sudolineno; - LEXTRACE("\n"); - return(COMMENT); +{ + \\[:\,=\\ \t#] { + LEXTRACE("QUOTEDCHAR "); + fill_args(yytext + 1, 1, sawspace); + sawspace = FALSE; } -[:\,=\n] { + [#:\,=\n] { BEGIN INITIAL; unput(*yytext); return(COMMAND); } /* end of command line args */ -\n { - ++sudolineno; - LEXTRACE("\n"); - BEGIN INITIAL; - return(COMMENT); - } /* return newline */ - -#.*\n { - ++sudolineno; - LEXTRACE("\n"); - return(COMMENT); - } /* return comments */ - -[^\\:, \t\n]+ { + [^\\:, \t\n]+ { LEXTRACE("ARG "); fill_args(yytext, yyleng, sawspace); sawspace = FALSE; - } /* a command line arg */ - -, { - LEXTRACE(", "); - return(','); - } /* return ',' */ + } /* a command line arg */ +} -!+ { - if (yyleng % 2 == 1) - return('!'); /* return '!' */ +^Defaults[:@]? { + BEGIN GOTDEFS; + switch (yytext[8]) { + case ':': + LEXTRACE("DEFAULTS_USER "); + return(DEFAULTS_USER); + case '@': + LEXTRACE("DEFAULTS_HOST "); + return(DEFAULTS_HOST); + default: + LEXTRACE("DEFAULTS "); + return(DEFAULTS); + } } -= { - LEXTRACE("= "); - return('='); - } /* return '=' */ - -: { - LEXTRACE(": "); - return(':'); - } /* return ':' */ +^(Host|Cmnd|User|Runas)_Alias { + fill(yytext, yyleng); + switch (*yytext) { + case 'H': + LEXTRACE("HOSTALIAS "); + return(HOSTALIAS); + case 'C': + LEXTRACE("CMNDALIAS "); + return(CMNDALIAS); + case 'U': + LEXTRACE("USERALIAS "); + return(USERALIAS); + case 'R': + LEXTRACE("RUNASALIAS "); + BEGIN GOTRUNAS; + return(RUNASALIAS); + } + } NOPASSWD[[:blank:]]*: { /* cmnd does not require passwd for this user */ @@ -218,8 +240,7 @@ PASSWD[[:blank:]]*: { return (RUNAS); } -[[:upper:]][[:upper:][:digit:]_]* { - /* Runas_Alias user can run command as or ALL */ +[[:upper:]][[:upper:][:digit:]_]* { if (strcmp(yytext, "ALL") == 0) { LEXTRACE("ALL "); return(ALL); @@ -241,61 +262,6 @@ PASSWD[[:blank:]]*: { BEGIN INITIAL; } -[[:upper:]][[:upper:][:digit:]_]* { - if (strcmp(yytext, "ALL") == 0) { - LEXTRACE("ALL "); - return(ALL); - } else { - fill(yytext, yyleng); - LEXTRACE("ALIAS "); - return(ALIAS); - } - } - -{WORD} { - LEXTRACE("WORD(3) "); - fill(yytext, yyleng); - return(WORD); - } - -^Defaults[:@]? { - BEGIN GOTDEFS; - if (yyleng == 9) { - switch (yytext[8]) { - case ':' : - LEXTRACE("DEFAULTS_USER "); - return(DEFAULTS_USER); - case '@' : - LEXTRACE("DEFAULTS_HOST "); - return(DEFAULTS_HOST); - } - } else { - LEXTRACE("DEFAULTS "); - return(DEFAULTS); - } - } - -^(Host|Cmnd|User|Runas)_Alias { - fill(yytext, yyleng); - if (*yytext == 'H') { - LEXTRACE("HOSTALIAS "); - return(HOSTALIAS); - } - if (*yytext == 'C') { - LEXTRACE("CMNDALIAS "); - return(CMNDALIAS); - } - if (*yytext == 'U') { - LEXTRACE("USERALIAS "); - return(USERALIAS); - } - if (*yytext == 'R') { - LEXTRACE("RUNASALIAS "); - BEGIN GOTRUNAS; - return(RUNASALIAS); - } - } - \/(\\[\,:= \t#]|[^\,:=\\ \t\n#])+ { /* directories can't have args... */ if (yytext[yyleng - 1] == '/') { @@ -309,14 +275,58 @@ PASSWD[[:blank:]]*: { } } /* a pathname */ -{WORD} { +{WORD} { /* a word */ fill(yytext, yyleng); - LEXTRACE("WORD(4) "); + LEXTRACE("WORD(3) "); return(WORD); } -. { +, { + LEXTRACE(", "); + return(','); + } /* return ',' */ + += { + LEXTRACE("= "); + return('='); + } /* return '=' */ + +: { + LEXTRACE(": "); + return(':'); + } /* return ':' */ + +<*>!+ { + if (yyleng % 2 == 1) + return('!'); /* return '!' */ + } + +<*>\n { + BEGIN INITIAL; + ++sudolineno; + LEXTRACE("\n"); + return(COMMENT); + } /* return newline */ + +<*>[[:blank:]]+ { /* throw away space/tabs */ + sawspace = TRUE; /* but remember for fill_args */ + } + +<*>\\[[:blank:]]*\n { + sawspace = TRUE; /* remember for fill_args */ + ++sudolineno; + LEXTRACE("\n\t"); + } /* throw away EOL after \ */ + +#.*\n { + BEGIN INITIAL; + ++sudolineno; + LEXTRACE("\n"); + return(COMMENT); + } /* return comments */ + +<*>. { LEXTRACE("ERROR "); return(ERROR); } /* parse error */