diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 2002-01-03 03:49:17 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 2002-01-03 03:49:17 +0000 |
commit | a8c409b2b43635d095e5e8b5fd8fcd42fc4a539c (patch) | |
tree | 69468cedd38b3d8eb953e6fdfbdc23e8500f93cc /usr.bin/sudo/parse.lex | |
parent | 2e8dc04dc3a4b4d1e0664c16b572efd2c74466e5 (diff) |
Update to sudo 1.6.4
Diffstat (limited to 'usr.bin/sudo/parse.lex')
-rw-r--r-- | usr.bin/sudo/parse.lex | 284 |
1 files changed, 154 insertions, 130 deletions
diff --git a/usr.bin/sudo/parse.lex b/usr.bin/sudo/parse.lex index 4d78b5569ad..b6d2385125a 100644 --- a/usr.bin/sudo/parse.lex +++ b/usr.bin/sudo/parse.lex @@ -1,6 +1,6 @@ %{ /* - * Copyright (c) 1996, 1998, 1999 Todd C. Miller <Todd.Miller@courtesan.com> + * Copyright (c) 1996, 1998-2001 Todd C. Miller <Todd.Miller@courtesan.com> * All rights reserved. * * This code is derived from software contributed by Chris Jepeway @@ -39,30 +39,37 @@ #include "config.h" +#include <sys/types.h> +#include <sys/param.h> +#include <stdio.h> #ifdef STDC_HEADERS -#include <stdlib.h> +# include <stdlib.h> +# include <stddef.h> +#else +# ifdef HAVE_STDLIB_H +# include <stdlib.h> +# endif #endif /* STDC_HEADERS */ -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif /* HAVE_UNISTD_H */ #ifdef HAVE_STRING_H -#include <string.h> +# include <string.h> +#else +# ifdef HAVE_STRINGS_H +# include <strings.h> +# endif #endif /* HAVE_STRING_H */ -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif /* HAVE_STRINGS_H */ +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif /* HAVE_UNISTD_H */ #if defined(HAVE_MALLOC_H) && !defined(STDC_HEADERS) -#include <malloc.h> +# include <malloc.h> #endif /* HAVE_MALLOC_H && !STDC_HEADERS */ #include <ctype.h> -#include <sys/types.h> -#include <sys/param.h> #include "sudo.h" #include "parse.h" -#include "sudo.tab.h" +#include <sudo.tab.h> #ifndef lint -static const char rcsid[] = "$Sudo: parse.lex,v 1.111 2000/03/23 04:38:20 millert Exp $"; +static const char rcsid[] = "$Sudo: parse.lex,v 1.117 2001/12/30 22:12:06 millert Exp $"; #endif /* lint */ #undef yywrap /* guard against a yywrap macro */ @@ -93,86 +100,115 @@ extern void yyerror __P((char *)); OCTET (1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]) DOTTEDQUAD {OCTET}(\.{OCTET}){3} HOSTNAME [[:alnum:]_-]+ -WORD ([^@!=:,\(\) \t\n\\]|\\[^\n])+ +WORD ([^#@!=:,\(\) \t\n\\]|\\[^\n])+ +ENVAR ([^#!=, \t\n\\]|\\[^\n])([^#=, \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 */ +<GOTDEFS>[[:blank:]]+ BEGIN STARTDEFS; + +<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 \ */ +<INDEFS>{ + , { + BEGIN STARTDEFS; + LEXTRACE(", "); + return(','); + } /* return ',' */ -<GOTCMND>\\[:\,=\\ \t] { - LEXTRACE("QUOTEDCHAR "); - fill_args(yytext + 1, 1, sawspace); - sawspace = FALSE; - } + = { + LEXTRACE("= "); + return('='); + } /* return '=' */ + + \+= { + LEXTRACE("+= "); + return('+'); + } /* return '+' */ -<GOTDEFS>\"([^\"]|\\\")+\" { + -= { + LEXTRACE("-= "); + return('-'); + } /* return '-' */ + + \"([^\"]|\\\")+\" { LEXTRACE("WORD(1) "); fill(yytext + 1, yyleng - 2); return(WORD); } -<GOTDEFS>(#.*)?\n { - BEGIN INITIAL; - ++sudolineno; - LEXTRACE("\n"); - return(COMMENT); + {ENVAR} { + LEXTRACE("WORD(2) "); + fill(yytext, yyleng); + return(WORD); + } +} + +<GOTCMND>{ + \\[:\,= \t#] { + LEXTRACE("QUOTEDCHAR "); + fill_args(yytext + 1, 1, sawspace); + sawspace = FALSE; } -<GOTCMND>[:\,=\n] { + [#:\,=\n] { BEGIN INITIAL; unput(*yytext); return(COMMAND); } /* end of command line args */ -\n { - ++sudolineno; - LEXTRACE("\n"); - BEGIN INITIAL; - return(COMMENT); - } /* return newline */ - -<INITIAL>#.*\n { - ++sudolineno; - LEXTRACE("\n"); - return(COMMENT); - } /* return comments */ - -<GOTCMND>[^\\:, \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 '!' */ +<INITIAL>^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 ':' */ +<INITIAL>^(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 +254,7 @@ PASSWD[[:blank:]]*: { return (RUNAS); } -<GOTRUNAS>[[:upper:]][[:upper:][:digit:]_]* { - /* Runas_Alias user can run command as or ALL */ +[[:upper:]][[:upper:][:digit:]_]* { if (strcmp(yytext, "ALL") == 0) { LEXTRACE("ALL "); return(ALL); @@ -230,10 +265,10 @@ PASSWD[[:blank:]]*: { } } -<GOTRUNAS>#?{WORD} { +<GOTRUNAS>(#[0-9-]+|{WORD}) { /* username/uid that user can run command as */ fill(yytext, yyleng); - LEXTRACE("WORD(2) "); + LEXTRACE("WORD(3) "); return(WORD); } @@ -241,62 +276,7 @@ PASSWD[[:blank:]]*: { BEGIN INITIAL; } -[[:upper:]][[:upper:][:digit:]_]* { - if (strcmp(yytext, "ALL") == 0) { - LEXTRACE("ALL "); - return(ALL); - } else { - fill(yytext, yyleng); - LEXTRACE("ALIAS "); - return(ALIAS); - } - } - -<GOTDEFS>{WORD} { - LEXTRACE("WORD(3) "); - fill(yytext, yyleng); - return(WORD); - } - -<INITIAL>^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); - } - } - -<INITIAL>^(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\n#]+ { +\/(\\[\,:= \t#]|[^\,:=\\ \t\n#])+ { /* directories can't have args... */ if (yytext[yyleng - 1] == '/') { LEXTRACE("COMMAND "); @@ -309,14 +289,58 @@ PASSWD[[:blank:]]*: { } } /* a pathname */ -<INITIAL>{WORD} { +<INITIAL,GOTDEFS>{WORD} { /* a word */ fill(yytext, yyleng); LEXTRACE("WORD(4) "); 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 \ */ + +<INITIAL,STARTDEFS,INDEFS>#.*\n { + BEGIN INITIAL; + ++sudolineno; + LEXTRACE("\n"); + return(COMMENT); + } /* return comments */ + +<*>. { LEXTRACE("ERROR "); return(ERROR); } /* parse error */ @@ -354,7 +378,7 @@ fill_cmnd(s, len) if (yylval.command.cmnd == NULL) yyerror("unable to allocate memory"); - /* copy the string and NULL-terminate it */ + /* copy the string and NULL-terminate it (escapes handled by fnmatch) */ (void) strncpy(yylval.command.cmnd, s, len); yylval.command.cmnd[len] = '\0'; |