summaryrefslogtreecommitdiff
path: root/usr.bin/sudo/parse.lex
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2002-01-03 03:49:17 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2002-01-03 03:49:17 +0000
commita8c409b2b43635d095e5e8b5fd8fcd42fc4a539c (patch)
tree69468cedd38b3d8eb953e6fdfbdc23e8500f93cc /usr.bin/sudo/parse.lex
parent2e8dc04dc3a4b4d1e0664c16b572efd2c74466e5 (diff)
Update to sudo 1.6.4
Diffstat (limited to 'usr.bin/sudo/parse.lex')
-rw-r--r--usr.bin/sudo/parse.lex284
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';