#include "sudo.h"
#include "parse.h"
+#include "gram.h"
/*
* We must define SIZE_MAX for yacc's skeleton.c.
* Globals
*/
extern int sudolineno;
+extern int last_token;
extern char *sudoers;
static int verbose = FALSE;
int parse_error = FALSE;
yyerror(s)
const char *s;
{
+ /* If we last saw a newline the error is on the preceding line. */
+ if (last_token == COMMENT)
+ sudolineno--;
+
/* Save the line the first error occurred on. */
if (errorlineno == -1) {
- errorlineno = sudolineno ? sudolineno - 1 : 0;
+ errorlineno = sudolineno;
errorfile = estrdup(sudoers);
}
if (verbose && s != NULL) {
#ifndef TRACELEXER
(void) fprintf(stderr, ">>> %s: %s near line %d <<<\n", sudoers, s,
- sudolineno ? sudolineno - 1 : 0);
+ sudolineno);
#else
(void) fprintf(stderr, "<*> ");
#endif
}
parse_error = TRUE;
}
-#line 112 "gram.y"
+#line 118 "gram.y"
#ifndef YYSTYPE_DEFINED
#define YYSTYPE_DEFINED
typedef union {
int tok;
} YYSTYPE;
#endif /* YYSTYPE_DEFINED */
-#line 138 "y.tab.c"
+#line 144 "y.tab.c"
#define COMMAND 257
#define ALIAS 258
#define DEFVAR 259
short *yysslim;
YYSTYPE *yyvs;
int yystacksize;
-#line 606 "gram.y"
+#line 612 "gram.y"
static struct defaults *
new_default(var, val, op)
char *var;
errorfile = NULL;
verbose = !quiet;
}
-#line 774 "y.tab.c"
+#line 780 "y.tab.c"
/* allocate initial stack or double stack size, up to YYMAXDEPTH */
#if defined(__cplusplus) || defined(__STDC__)
static int yygrowstack(void)
switch (yyn)
{
case 1:
-#line 187 "gram.y"
+#line 193 "gram.y"
{ ; }
break;
case 5:
-#line 195 "gram.y"
+#line 201 "gram.y"
{
;
}
break;
case 6:
-#line 198 "gram.y"
+#line 204 "gram.y"
{
yyerrok;
}
break;
case 7:
-#line 201 "gram.y"
+#line 207 "gram.y"
{
add_userspec(yyvsp[-1].member, yyvsp[0].privilege);
}
break;
case 8:
-#line 204 "gram.y"
+#line 210 "gram.y"
{
;
}
break;
case 9:
-#line 207 "gram.y"
+#line 213 "gram.y"
{
;
}
break;
case 10:
-#line 210 "gram.y"
+#line 216 "gram.y"
{
;
}
break;
case 11:
-#line 213 "gram.y"
+#line 219 "gram.y"
{
;
}
break;
case 12:
-#line 216 "gram.y"
+#line 222 "gram.y"
{
add_defaults(DEFAULTS, NULL, yyvsp[0].defaults);
}
break;
case 13:
-#line 219 "gram.y"
+#line 225 "gram.y"
{
add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults);
}
break;
case 14:
-#line 222 "gram.y"
+#line 228 "gram.y"
{
add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults);
}
break;
case 15:
-#line 225 "gram.y"
+#line 231 "gram.y"
{
add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults);
}
break;
case 16:
-#line 228 "gram.y"
+#line 234 "gram.y"
{
add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults);
}
break;
case 18:
-#line 234 "gram.y"
+#line 240 "gram.y"
{
list_append(yyvsp[-2].defaults, yyvsp[0].defaults);
yyval.defaults = yyvsp[-2].defaults;
}
break;
case 19:
-#line 240 "gram.y"
+#line 246 "gram.y"
{
yyval.defaults = new_default(yyvsp[0].string, NULL, TRUE);
}
break;
case 20:
-#line 243 "gram.y"
+#line 249 "gram.y"
{
yyval.defaults = new_default(yyvsp[0].string, NULL, FALSE);
}
break;
case 21:
-#line 246 "gram.y"
+#line 252 "gram.y"
{
yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, TRUE);
}
break;
case 22:
-#line 249 "gram.y"
+#line 255 "gram.y"
{
yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
}
break;
case 23:
-#line 252 "gram.y"
+#line 258 "gram.y"
{
yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
}
break;
case 25:
-#line 258 "gram.y"
+#line 264 "gram.y"
{
list_append(yyvsp[-2].privilege, yyvsp[0].privilege);
yyval.privilege = yyvsp[-2].privilege;
}
break;
case 26:
-#line 264 "gram.y"
+#line 270 "gram.y"
{
struct privilege *p = emalloc(sizeof(*p));
list2tq(&p->hostlist, yyvsp[-2].member);
}
break;
case 27:
-#line 274 "gram.y"
+#line 280 "gram.y"
{
yyval.member = yyvsp[0].member;
yyval.member->negated = FALSE;
}
break;
case 28:
-#line 278 "gram.y"
+#line 284 "gram.y"
{
yyval.member = yyvsp[0].member;
yyval.member->negated = TRUE;
}
break;
case 29:
-#line 284 "gram.y"
+#line 290 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, ALIAS);
}
break;
case 30:
-#line 287 "gram.y"
+#line 293 "gram.y"
{
yyval.member = new_member(NULL, ALL);
}
break;
case 31:
-#line 290 "gram.y"
+#line 296 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, NETGROUP);
}
break;
case 32:
-#line 293 "gram.y"
+#line 299 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, NTWKADDR);
}
break;
case 33:
-#line 296 "gram.y"
+#line 302 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, WORD);
}
break;
case 35:
-#line 302 "gram.y"
+#line 308 "gram.y"
{
list_append(yyvsp[-2].cmndspec, yyvsp[0].cmndspec);
#ifdef HAVE_SELINUX
}
break;
case 36:
-#line 334 "gram.y"
+#line 340 "gram.y"
{
struct cmndspec *cs = emalloc(sizeof(*cs));
if (yyvsp[-3].runas != NULL) {
}
break;
case 37:
-#line 360 "gram.y"
+#line 366 "gram.y"
{
yyval.member = yyvsp[0].member;
yyval.member->negated = FALSE;
}
break;
case 38:
-#line 364 "gram.y"
+#line 370 "gram.y"
{
yyval.member = yyvsp[0].member;
yyval.member->negated = TRUE;
}
break;
case 39:
-#line 370 "gram.y"
+#line 376 "gram.y"
{
yyval.string = yyvsp[0].string;
}
break;
case 40:
-#line 375 "gram.y"
+#line 381 "gram.y"
{
yyval.string = yyvsp[0].string;
}
break;
case 41:
-#line 380 "gram.y"
+#line 386 "gram.y"
{
yyval.seinfo.role = NULL;
yyval.seinfo.type = NULL;
}
break;
case 42:
-#line 384 "gram.y"
+#line 390 "gram.y"
{
yyval.seinfo.role = yyvsp[0].string;
yyval.seinfo.type = NULL;
}
break;
case 43:
-#line 388 "gram.y"
+#line 394 "gram.y"
{
yyval.seinfo.type = yyvsp[0].string;
yyval.seinfo.role = NULL;
}
break;
case 44:
-#line 392 "gram.y"
+#line 398 "gram.y"
{
yyval.seinfo.role = yyvsp[-1].string;
yyval.seinfo.type = yyvsp[0].string;
}
break;
case 45:
-#line 396 "gram.y"
+#line 402 "gram.y"
{
yyval.seinfo.type = yyvsp[-1].string;
yyval.seinfo.role = yyvsp[0].string;
}
break;
case 46:
-#line 402 "gram.y"
+#line 408 "gram.y"
{
yyval.runas = NULL;
}
break;
case 47:
-#line 405 "gram.y"
+#line 411 "gram.y"
{
yyval.runas = yyvsp[-1].runas;
}
break;
case 48:
-#line 410 "gram.y"
+#line 416 "gram.y"
{
yyval.runas = emalloc(sizeof(struct runascontainer));
yyval.runas->runasusers = yyvsp[0].member;
}
break;
case 49:
-#line 415 "gram.y"
+#line 421 "gram.y"
{
yyval.runas = emalloc(sizeof(struct runascontainer));
yyval.runas->runasusers = yyvsp[-2].member;
}
break;
case 50:
-#line 420 "gram.y"
+#line 426 "gram.y"
{
yyval.runas = emalloc(sizeof(struct runascontainer));
yyval.runas->runasusers = NULL;
}
break;
case 51:
-#line 427 "gram.y"
+#line 433 "gram.y"
{
yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv =
yyval.tag.log_input = yyval.tag.log_output = UNSPEC;
}
break;
case 52:
-#line 431 "gram.y"
+#line 437 "gram.y"
{
yyval.tag.nopasswd = TRUE;
}
break;
case 53:
-#line 434 "gram.y"
+#line 440 "gram.y"
{
yyval.tag.nopasswd = FALSE;
}
break;
case 54:
-#line 437 "gram.y"
+#line 443 "gram.y"
{
yyval.tag.noexec = TRUE;
}
break;
case 55:
-#line 440 "gram.y"
+#line 446 "gram.y"
{
yyval.tag.noexec = FALSE;
}
break;
case 56:
-#line 443 "gram.y"
+#line 449 "gram.y"
{
yyval.tag.setenv = TRUE;
}
break;
case 57:
-#line 446 "gram.y"
+#line 452 "gram.y"
{
yyval.tag.setenv = FALSE;
}
break;
case 58:
-#line 449 "gram.y"
+#line 455 "gram.y"
{
yyval.tag.log_input = TRUE;
}
break;
case 59:
-#line 452 "gram.y"
+#line 458 "gram.y"
{
yyval.tag.log_input = FALSE;
}
break;
case 60:
-#line 455 "gram.y"
+#line 461 "gram.y"
{
yyval.tag.log_output = TRUE;
}
break;
case 61:
-#line 458 "gram.y"
+#line 464 "gram.y"
{
yyval.tag.log_output = FALSE;
}
break;
case 62:
-#line 463 "gram.y"
+#line 469 "gram.y"
{
yyval.member = new_member(NULL, ALL);
}
break;
case 63:
-#line 466 "gram.y"
+#line 472 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, ALIAS);
}
break;
case 64:
-#line 469 "gram.y"
+#line 475 "gram.y"
{
struct sudo_command *c = emalloc(sizeof(*c));
c->cmnd = yyvsp[0].command.cmnd;
}
break;
case 67:
-#line 481 "gram.y"
+#line 487 "gram.y"
{
char *s;
if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
}
break;
case 69:
-#line 491 "gram.y"
+#line 497 "gram.y"
{
list_append(yyvsp[-2].member, yyvsp[0].member);
yyval.member = yyvsp[-2].member;
}
break;
case 72:
-#line 501 "gram.y"
+#line 507 "gram.y"
{
char *s;
if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
}
break;
case 74:
-#line 511 "gram.y"
+#line 517 "gram.y"
{
list_append(yyvsp[-2].member, yyvsp[0].member);
yyval.member = yyvsp[-2].member;
}
break;
case 77:
-#line 521 "gram.y"
+#line 527 "gram.y"
{
char *s;
if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
}
break;
case 80:
-#line 534 "gram.y"
+#line 540 "gram.y"
{
char *s;
if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
}
break;
case 82:
-#line 544 "gram.y"
+#line 550 "gram.y"
{
list_append(yyvsp[-2].member, yyvsp[0].member);
yyval.member = yyvsp[-2].member;
}
break;
case 83:
-#line 550 "gram.y"
+#line 556 "gram.y"
{
yyval.member = yyvsp[0].member;
yyval.member->negated = FALSE;
}
break;
case 84:
-#line 554 "gram.y"
+#line 560 "gram.y"
{
yyval.member = yyvsp[0].member;
yyval.member->negated = TRUE;
}
break;
case 85:
-#line 560 "gram.y"
+#line 566 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, ALIAS);
}
break;
case 86:
-#line 563 "gram.y"
+#line 569 "gram.y"
{
yyval.member = new_member(NULL, ALL);
}
break;
case 87:
-#line 566 "gram.y"
+#line 572 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, NETGROUP);
}
break;
case 88:
-#line 569 "gram.y"
+#line 575 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, USERGROUP);
}
break;
case 89:
-#line 572 "gram.y"
+#line 578 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, WORD);
}
break;
case 91:
-#line 578 "gram.y"
+#line 584 "gram.y"
{
list_append(yyvsp[-2].member, yyvsp[0].member);
yyval.member = yyvsp[-2].member;
}
break;
case 92:
-#line 584 "gram.y"
+#line 590 "gram.y"
{
yyval.member = yyvsp[0].member;
yyval.member->negated = FALSE;
}
break;
case 93:
-#line 588 "gram.y"
+#line 594 "gram.y"
{
yyval.member = yyvsp[0].member;
yyval.member->negated = TRUE;
}
break;
case 94:
-#line 594 "gram.y"
+#line 600 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, ALIAS);
}
break;
case 95:
-#line 597 "gram.y"
+#line 603 "gram.y"
{
yyval.member = new_member(NULL, ALL);
}
break;
case 96:
-#line 600 "gram.y"
+#line 606 "gram.y"
{
yyval.member = new_member(yyvsp[0].string, WORD);
}
break;
-#line 1543 "y.tab.c"
+#line 1549 "y.tab.c"
}
yyssp -= yym;
yystate = *yyssp;
#include "sudo.h"
#include "parse.h"
+#include "gram.h"
/*
* We must define SIZE_MAX for yacc's skeleton.c.
* Globals
*/
extern int sudolineno;
+extern int last_token;
extern char *sudoers;
static int verbose = FALSE;
int parse_error = FALSE;
yyerror(s)
const char *s;
{
+ /* If we last saw a newline the error is on the preceding line. */
+ if (last_token == COMMENT)
+ sudolineno--;
+
/* Save the line the first error occurred on. */
if (errorlineno == -1) {
- errorlineno = sudolineno ? sudolineno - 1 : 0;
+ errorlineno = sudolineno;
errorfile = estrdup(sudoers);
}
if (verbose && s != NULL) {
#ifndef TRACELEXER
(void) fprintf(stderr, ">>> %s: %s near line %d <<<\n", sudoers, s,
- sudolineno ? sudolineno - 1 : 0);
+ sudolineno);
#else
(void) fprintf(stderr, "<*> ");
#endif
/* A lexical scanner generated by flex */
/* Scanner skeleton version:
- * $Header: /cvs/src/usr.bin/lex/flex.skl,v 1.11 2010/08/04 18:24:50 millert Exp $
+ * $Header: /home/cvs/openbsd/src/usr.bin/lex/flex.skl,v 1.11 2010/08/04 18:24:50 millert Exp $
*/
#define FLEX_SCANNER
extern YYSTYPE yylval;
extern int parse_error;
int sudolineno;
+int last_token;
char *sudoers;
static int continued, prev_state, sawspace;
#define fill(a, b) fill_txt(a, b, 0)
+#define LEXRETURN(n) do { \
+ last_token = (n); \
+ return (n); \
+} while (0)
+
#define push_include(_p) (_push_include((_p), FALSE))
#define push_includedir(_p) (_push_include((_p), TRUE))
#define INSTR 5
-#line 1512 "lex.yy.c"
+#line 1518 "lex.yy.c"
/* Macros after this point can all be overridden by user definitions in
* section 1.
register char *yy_cp, *yy_bp;
register int yy_act;
-#line 120 "toke.l"
+#line 126 "toke.l"
-#line 1668 "lex.yy.c"
+#line 1674 "lex.yy.c"
if ( yy_init )
{
case 1:
YY_RULE_SETUP
-#line 121 "toke.l"
+#line 127 "toke.l"
{
LEXTRACE(", ");
- return ',';
+ LEXRETURN(',');
} /* return ',' */
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 126 "toke.l"
+#line 132 "toke.l"
BEGIN STARTDEFS;
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 128 "toke.l"
+#line 134 "toke.l"
{
BEGIN INDEFS;
LEXTRACE("DEFVAR ");
if (!fill(yytext, yyleng))
yyterminate();
- return DEFVAR;
+ LEXRETURN(DEFVAR);
}
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 137 "toke.l"
+#line 143 "toke.l"
{
BEGIN STARTDEFS;
LEXTRACE(", ");
- return ',';
+ LEXRETURN(',');
} /* return ',' */
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 143 "toke.l"
+#line 149 "toke.l"
{
LEXTRACE("= ");
- return '=';
+ LEXRETURN('=');
} /* return '=' */
YY_BREAK
case 6:
YY_RULE_SETUP
-#line 148 "toke.l"
+#line 154 "toke.l"
{
LEXTRACE("+= ");
- return '+';
+ LEXRETURN('+');
} /* return '+' */
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 153 "toke.l"
+#line 159 "toke.l"
{
LEXTRACE("-= ");
- return '-';
+ LEXRETURN('-');
} /* return '-' */
YY_BREAK
case 8:
YY_RULE_SETUP
-#line 158 "toke.l"
+#line 164 "toke.l"
{
LEXTRACE("BEGINSTR ");
yylval.string = NULL;
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 165 "toke.l"
+#line 171 "toke.l"
{
LEXTRACE("WORD(2) ");
if (!fill(yytext, yyleng))
yyterminate();
- return WORD;
+ LEXRETURN(WORD);
}
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 174 "toke.l"
+#line 180 "toke.l"
{
/* Line continuation char followed by newline. */
- ++sudolineno;
+ sudolineno++;
continued = TRUE;
}
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 180 "toke.l"
+#line 186 "toke.l"
{
LEXTRACE("ENDSTR ");
BEGIN prev_state;
if (yylval.string == NULL) {
LEXTRACE("ERROR "); /* empty string */
- return ERROR;
+ LEXRETURN(ERROR);
}
if (prev_state == INITIAL) {
switch (yylval.string[0]) {
(yylval.string[1] == ':' &&
yylval.string[2] == '\0')) {
LEXTRACE("ERROR "); /* empty group */
- return ERROR;
+ LEXRETURN(ERROR);
}
LEXTRACE("USERGROUP ");
- return USERGROUP;
+ LEXRETURN(USERGROUP);
case '+':
if (yylval.string[1] == '\0') {
LEXTRACE("ERROR "); /* empty netgroup */
- return ERROR;
+ LEXRETURN(ERROR);
}
LEXTRACE("NETGROUP ");
- return NETGROUP;
+ LEXRETURN(NETGROUP);
}
}
LEXTRACE("WORD(4) ");
- return WORD;
+ LEXRETURN(WORD);
}
YY_BREAK
case 12:
YY_RULE_SETUP
-#line 212 "toke.l"
+#line 218 "toke.l"
{
LEXTRACE("BACKSLASH ");
if (!append(yytext, yyleng))
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 218 "toke.l"
+#line 224 "toke.l"
{
LEXTRACE("STRBODY ");
if (!append(yytext, yyleng))
case 14:
YY_RULE_SETUP
-#line 226 "toke.l"
+#line 232 "toke.l"
{
/* quoted fnmatch glob char, pass verbatim */
LEXTRACE("QUOTEDCHAR ");
YY_BREAK
case 15:
YY_RULE_SETUP
-#line 234 "toke.l"
+#line 240 "toke.l"
{
/* quoted sudoers special char, strip backslash */
LEXTRACE("QUOTEDCHAR ");
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 242 "toke.l"
+#line 248 "toke.l"
{
BEGIN INITIAL;
yyless(0);
- return COMMAND;
+ LEXRETURN(COMMAND);
} /* end of command line args */
YY_BREAK
case 17:
YY_RULE_SETUP
-#line 248 "toke.l"
+#line 254 "toke.l"
{
LEXTRACE("ARG ");
if (!fill_args(yytext, yyleng, sawspace))
case 18:
YY_RULE_SETUP
-#line 256 "toke.l"
+#line 262 "toke.l"
{
char *path;
if (continued) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
if ((path = parse_include(yytext)) == NULL)
YY_BREAK
case 19:
YY_RULE_SETUP
-#line 274 "toke.l"
+#line 280 "toke.l"
{
char *path;
if (continued) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
if ((path = parse_include(yytext)) == NULL)
YY_BREAK
case 20:
YY_RULE_SETUP
-#line 295 "toke.l"
+#line 301 "toke.l"
{
char deftype;
int n;
if (continued) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
for (n = 0; isblank((unsigned char)yytext[n]); n++)
case ':':
yyless(n);
LEXTRACE("DEFAULTS_USER ");
- return DEFAULTS_USER;
+ LEXRETURN(DEFAULTS_USER);
case '>':
yyless(n);
LEXTRACE("DEFAULTS_RUNAS ");
- return DEFAULTS_RUNAS;
+ LEXRETURN(DEFAULTS_RUNAS);
case '@':
yyless(n);
LEXTRACE("DEFAULTS_HOST ");
- return DEFAULTS_HOST;
+ LEXRETURN(DEFAULTS_HOST);
case '!':
yyless(n);
LEXTRACE("DEFAULTS_CMND ");
- return DEFAULTS_CMND;
+ LEXRETURN(DEFAULTS_CMND);
default:
LEXTRACE("DEFAULTS ");
- return DEFAULTS;
+ LEXRETURN(DEFAULTS);
}
}
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 335 "toke.l"
+#line 341 "toke.l"
{
int n;
if (continued) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
for (n = 0; isblank((unsigned char)yytext[n]); n++)
switch (yytext[n]) {
case 'H':
LEXTRACE("HOSTALIAS ");
- return HOSTALIAS;
+ LEXRETURN(HOSTALIAS);
case 'C':
LEXTRACE("CMNDALIAS ");
- return CMNDALIAS;
+ LEXRETURN(CMNDALIAS);
case 'U':
LEXTRACE("USERALIAS ");
- return USERALIAS;
+ LEXRETURN(USERALIAS);
case 'R':
LEXTRACE("RUNASALIAS ");
- return RUNASALIAS;
+ LEXRETURN(RUNASALIAS);
}
}
YY_BREAK
case 22:
YY_RULE_SETUP
-#line 361 "toke.l"
+#line 367 "toke.l"
{
/* cmnd does not require passwd for this user */
LEXTRACE("NOPASSWD ");
- return NOPASSWD;
+ LEXRETURN(NOPASSWD);
}
YY_BREAK
case 23:
YY_RULE_SETUP
-#line 367 "toke.l"
+#line 373 "toke.l"
{
/* cmnd requires passwd for this user */
LEXTRACE("PASSWD ");
- return PASSWD;
+ LEXRETURN(PASSWD);
}
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 373 "toke.l"
+#line 379 "toke.l"
{
LEXTRACE("NOEXEC ");
- return NOEXEC;
+ LEXRETURN(NOEXEC);
}
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 378 "toke.l"
+#line 384 "toke.l"
{
LEXTRACE("EXEC ");
- return EXEC;
+ LEXRETURN(EXEC);
}
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 383 "toke.l"
+#line 389 "toke.l"
{
LEXTRACE("SETENV ");
- return SETENV;
+ LEXRETURN(SETENV);
}
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 388 "toke.l"
+#line 394 "toke.l"
{
LEXTRACE("NOSETENV ");
- return NOSETENV;
+ LEXRETURN(NOSETENV);
}
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 393 "toke.l"
+#line 399 "toke.l"
{
LEXTRACE("LOG_OUTPUT ");
- return LOG_OUTPUT;
+ LEXRETURN(LOG_OUTPUT);
}
YY_BREAK
case 29:
YY_RULE_SETUP
-#line 398 "toke.l"
+#line 404 "toke.l"
{
LEXTRACE("NOLOG_OUTPUT ");
- return NOLOG_OUTPUT;
+ LEXRETURN(NOLOG_OUTPUT);
}
YY_BREAK
case 30:
YY_RULE_SETUP
-#line 403 "toke.l"
+#line 409 "toke.l"
{
LEXTRACE("LOG_INPUT ");
- return LOG_INPUT;
+ LEXRETURN(LOG_INPUT);
}
YY_BREAK
case 31:
YY_RULE_SETUP
-#line 408 "toke.l"
+#line 414 "toke.l"
{
LEXTRACE("NOLOG_INPUT ");
- return NOLOG_INPUT;
+ LEXRETURN(NOLOG_INPUT);
}
YY_BREAK
case 32:
YY_RULE_SETUP
-#line 413 "toke.l"
+#line 419 "toke.l"
{
/* empty group or netgroup */
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 419 "toke.l"
+#line 425 "toke.l"
{
/* netgroup */
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("NETGROUP ");
- return NETGROUP;
+ LEXRETURN(NETGROUP);
}
YY_BREAK
case 34:
YY_RULE_SETUP
-#line 427 "toke.l"
+#line 433 "toke.l"
{
/* group */
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("USERGROUP ");
- return USERGROUP;
+ LEXRETURN(USERGROUP);
}
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 435 "toke.l"
+#line 441 "toke.l"
{
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("NTWKADDR ");
- return NTWKADDR;
+ LEXRETURN(NTWKADDR);
}
YY_BREAK
case 36:
YY_RULE_SETUP
-#line 442 "toke.l"
+#line 448 "toke.l"
{
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("NTWKADDR ");
- return NTWKADDR;
+ LEXRETURN(NTWKADDR);
}
YY_BREAK
case 37:
YY_RULE_SETUP
-#line 449 "toke.l"
+#line 455 "toke.l"
{
if (!ipv6_valid(yytext)) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("NTWKADDR ");
- return NTWKADDR;
+ LEXRETURN(NTWKADDR);
}
YY_BREAK
case 38:
YY_RULE_SETUP
-#line 460 "toke.l"
+#line 466 "toke.l"
{
if (!ipv6_valid(yytext)) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("NTWKADDR ");
- return NTWKADDR;
+ LEXRETURN(NTWKADDR);
}
YY_BREAK
case 39:
YY_RULE_SETUP
-#line 471 "toke.l"
+#line 477 "toke.l"
{
LEXTRACE("ALL ");
- return ALL;
+ LEXRETURN(ALL);
}
YY_BREAK
case 40:
YY_RULE_SETUP
-#line 477 "toke.l"
+#line 483 "toke.l"
{
#ifdef HAVE_SELINUX
LEXTRACE("ROLE ");
- return ROLE;
+ LEXRETURN(ROLE);
#else
goto got_alias;
#endif
YY_BREAK
case 41:
YY_RULE_SETUP
-#line 486 "toke.l"
+#line 492 "toke.l"
{
#ifdef HAVE_SELINUX
LEXTRACE("TYPE ");
- return TYPE;
+ LEXRETURN(TYPE);
#else
goto got_alias;
#endif
YY_BREAK
case 42:
YY_RULE_SETUP
-#line 495 "toke.l"
+#line 501 "toke.l"
{
got_alias:
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("ALIAS ");
- return ALIAS;
+ LEXRETURN(ALIAS);
}
YY_BREAK
case 43:
YY_RULE_SETUP
-#line 503 "toke.l"
+#line 509 "toke.l"
{
/* no command args allowed for Defaults!/path */
if (!fill_cmnd(yytext, yyleng))
yyterminate();
LEXTRACE("COMMAND ");
- return COMMAND;
+ LEXRETURN(COMMAND);
}
YY_BREAK
case 44:
YY_RULE_SETUP
-#line 511 "toke.l"
+#line 517 "toke.l"
{
BEGIN GOTCMND;
LEXTRACE("COMMAND ");
YY_BREAK
case 45:
YY_RULE_SETUP
-#line 518 "toke.l"
+#line 524 "toke.l"
{
/* directories can't have args... */
if (yytext[yyleng - 1] == '/') {
LEXTRACE("COMMAND ");
if (!fill_cmnd(yytext, yyleng))
yyterminate();
- return COMMAND;
+ LEXRETURN(COMMAND);
} else {
BEGIN GOTCMND;
LEXTRACE("COMMAND ");
YY_BREAK
case 46:
YY_RULE_SETUP
-#line 533 "toke.l"
+#line 539 "toke.l"
{
LEXTRACE("BEGINSTR ");
yylval.string = NULL;
YY_BREAK
case 47:
YY_RULE_SETUP
-#line 540 "toke.l"
+#line 546 "toke.l"
{
/* a word */
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("WORD(5) ");
- return WORD;
+ LEXRETURN(WORD);
}
YY_BREAK
case 48:
YY_RULE_SETUP
-#line 548 "toke.l"
+#line 554 "toke.l"
{
LEXTRACE("( ");
- return '(';
+ LEXRETURN('(');
}
YY_BREAK
case 49:
YY_RULE_SETUP
-#line 553 "toke.l"
+#line 559 "toke.l"
{
LEXTRACE(") ");
- return ')';
+ LEXRETURN(')');
}
YY_BREAK
case 50:
YY_RULE_SETUP
-#line 558 "toke.l"
+#line 564 "toke.l"
{
LEXTRACE(", ");
- return ',';
+ LEXRETURN(',');
} /* return ',' */
YY_BREAK
case 51:
YY_RULE_SETUP
-#line 563 "toke.l"
+#line 569 "toke.l"
{
LEXTRACE("= ");
- return '=';
+ LEXRETURN('=');
} /* return '=' */
YY_BREAK
case 52:
YY_RULE_SETUP
-#line 568 "toke.l"
+#line 574 "toke.l"
{
LEXTRACE(": ");
- return ':';
+ LEXRETURN(':');
} /* return ':' */
YY_BREAK
case 53:
YY_RULE_SETUP
-#line 573 "toke.l"
+#line 579 "toke.l"
{
if (yyleng & 1) {
LEXTRACE("!");
- return '!'; /* return '!' */
+ LEXRETURN('!'); /* return '!' */
}
}
YY_BREAK
case 54:
YY_RULE_SETUP
-#line 580 "toke.l"
+#line 586 "toke.l"
{
if (YY_START == INSTR) {
LEXTRACE("ERROR ");
- return ERROR; /* line break in string */
+ LEXRETURN(ERROR); /* line break in string */
}
BEGIN INITIAL;
- ++sudolineno;
+ sudolineno++;
continued = FALSE;
LEXTRACE("\n");
- return COMMENT;
+ LEXRETURN(COMMENT);
} /* return newline */
YY_BREAK
case 55:
YY_RULE_SETUP
-#line 592 "toke.l"
+#line 598 "toke.l"
{ /* throw away space/tabs */
sawspace = TRUE; /* but remember for fill_args */
}
YY_BREAK
case 56:
YY_RULE_SETUP
-#line 596 "toke.l"
+#line 602 "toke.l"
{
sawspace = TRUE; /* remember for fill_args */
- ++sudolineno;
+ sudolineno++;
continued = TRUE;
} /* throw away EOL after \ */
YY_BREAK
case 57:
YY_RULE_SETUP
-#line 602 "toke.l"
+#line 608 "toke.l"
{
BEGIN INITIAL;
- ++sudolineno;
+ sudolineno++;
continued = FALSE;
LEXTRACE("#\n");
- return COMMENT;
+ LEXRETURN(COMMENT);
} /* comment, not uid/gid */
YY_BREAK
case 58:
YY_RULE_SETUP
-#line 610 "toke.l"
+#line 616 "toke.l"
{
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
} /* parse error */
YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(STARTDEFS):
case YY_STATE_EOF(INDEFS):
case YY_STATE_EOF(INSTR):
-#line 615 "toke.l"
+#line 621 "toke.l"
{
if (YY_START != INITIAL) {
BEGIN INITIAL;
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
if (!pop_include())
yyterminate();
YY_BREAK
case 59:
YY_RULE_SETUP
-#line 625 "toke.l"
+#line 631 "toke.l"
ECHO;
YY_BREAK
-#line 2442 "lex.yy.c"
+#line 2448 "lex.yy.c"
case YY_END_OF_BUFFER:
{
return 0;
}
#endif
-#line 625 "toke.l"
+#line 631 "toke.l"
struct path_list {
char *path;
extern YYSTYPE yylval;
extern int parse_error;
int sudolineno;
+int last_token;
char *sudoers;
static int continued, prev_state, sawspace;
#define fill(a, b) fill_txt(a, b, 0)
+#define LEXRETURN(n) do { \
+ last_token = (n); \
+ return (n); \
+} while (0)
+
#define push_include(_p) (_push_include((_p), FALSE))
#define push_includedir(_p) (_push_include((_p), TRUE))
%%
<GOTDEFS>[[:blank:]]*,[[:blank:]]* {
LEXTRACE(", ");
- return ',';
+ LEXRETURN(',');
} /* return ',' */
<GOTDEFS>[[:blank:]]+ BEGIN STARTDEFS;
LEXTRACE("DEFVAR ");
if (!fill(yytext, yyleng))
yyterminate();
- return DEFVAR;
+ LEXRETURN(DEFVAR);
}
<INDEFS>{
, {
BEGIN STARTDEFS;
LEXTRACE(", ");
- return ',';
+ LEXRETURN(',');
} /* return ',' */
= {
LEXTRACE("= ");
- return '=';
+ LEXRETURN('=');
} /* return '=' */
\+= {
LEXTRACE("+= ");
- return '+';
+ LEXRETURN('+');
} /* return '+' */
-= {
LEXTRACE("-= ");
- return '-';
+ LEXRETURN('-');
} /* return '-' */
\" {
LEXTRACE("WORD(2) ");
if (!fill(yytext, yyleng))
yyterminate();
- return WORD;
+ LEXRETURN(WORD);
}
}
<INSTR>{
\\[[:blank:]]*\n[[:blank:]]* {
/* Line continuation char followed by newline. */
- ++sudolineno;
+ sudolineno++;
continued = TRUE;
}
if (yylval.string == NULL) {
LEXTRACE("ERROR "); /* empty string */
- return ERROR;
+ LEXRETURN(ERROR);
}
if (prev_state == INITIAL) {
switch (yylval.string[0]) {
(yylval.string[1] == ':' &&
yylval.string[2] == '\0')) {
LEXTRACE("ERROR "); /* empty group */
- return ERROR;
+ LEXRETURN(ERROR);
}
LEXTRACE("USERGROUP ");
- return USERGROUP;
+ LEXRETURN(USERGROUP);
case '+':
if (yylval.string[1] == '\0') {
LEXTRACE("ERROR "); /* empty netgroup */
- return ERROR;
+ LEXRETURN(ERROR);
}
LEXTRACE("NETGROUP ");
- return NETGROUP;
+ LEXRETURN(NETGROUP);
}
}
LEXTRACE("WORD(4) ");
- return WORD;
+ LEXRETURN(WORD);
}
\\ {
[#:\,=\n] {
BEGIN INITIAL;
yyless(0);
- return COMMAND;
+ LEXRETURN(COMMAND);
} /* end of command line args */
[^#\\:, \t\n]+ {
if (continued) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
if ((path = parse_include(yytext)) == NULL)
if (continued) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
if ((path = parse_include(yytext)) == NULL)
if (continued) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
for (n = 0; isblank((unsigned char)yytext[n]); n++)
case ':':
yyless(n);
LEXTRACE("DEFAULTS_USER ");
- return DEFAULTS_USER;
+ LEXRETURN(DEFAULTS_USER);
case '>':
yyless(n);
LEXTRACE("DEFAULTS_RUNAS ");
- return DEFAULTS_RUNAS;
+ LEXRETURN(DEFAULTS_RUNAS);
case '@':
yyless(n);
LEXTRACE("DEFAULTS_HOST ");
- return DEFAULTS_HOST;
+ LEXRETURN(DEFAULTS_HOST);
case '!':
yyless(n);
LEXTRACE("DEFAULTS_CMND ");
- return DEFAULTS_CMND;
+ LEXRETURN(DEFAULTS_CMND);
default:
LEXTRACE("DEFAULTS ");
- return DEFAULTS;
+ LEXRETURN(DEFAULTS);
}
}
if (continued) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
for (n = 0; isblank((unsigned char)yytext[n]); n++)
switch (yytext[n]) {
case 'H':
LEXTRACE("HOSTALIAS ");
- return HOSTALIAS;
+ LEXRETURN(HOSTALIAS);
case 'C':
LEXTRACE("CMNDALIAS ");
- return CMNDALIAS;
+ LEXRETURN(CMNDALIAS);
case 'U':
LEXTRACE("USERALIAS ");
- return USERALIAS;
+ LEXRETURN(USERALIAS);
case 'R':
LEXTRACE("RUNASALIAS ");
- return RUNASALIAS;
+ LEXRETURN(RUNASALIAS);
}
}
NOPASSWD[[:blank:]]*: {
/* cmnd does not require passwd for this user */
LEXTRACE("NOPASSWD ");
- return NOPASSWD;
+ LEXRETURN(NOPASSWD);
}
PASSWD[[:blank:]]*: {
/* cmnd requires passwd for this user */
LEXTRACE("PASSWD ");
- return PASSWD;
+ LEXRETURN(PASSWD);
}
NOEXEC[[:blank:]]*: {
LEXTRACE("NOEXEC ");
- return NOEXEC;
+ LEXRETURN(NOEXEC);
}
EXEC[[:blank:]]*: {
LEXTRACE("EXEC ");
- return EXEC;
+ LEXRETURN(EXEC);
}
SETENV[[:blank:]]*: {
LEXTRACE("SETENV ");
- return SETENV;
+ LEXRETURN(SETENV);
}
NOSETENV[[:blank:]]*: {
LEXTRACE("NOSETENV ");
- return NOSETENV;
+ LEXRETURN(NOSETENV);
}
LOG_OUTPUT[[:blank:]]*: {
LEXTRACE("LOG_OUTPUT ");
- return LOG_OUTPUT;
+ LEXRETURN(LOG_OUTPUT);
}
NOLOG_OUTPUT[[:blank:]]*: {
LEXTRACE("NOLOG_OUTPUT ");
- return NOLOG_OUTPUT;
+ LEXRETURN(NOLOG_OUTPUT);
}
LOG_INPUT[[:blank:]]*: {
LEXTRACE("LOG_INPUT ");
- return LOG_INPUT;
+ LEXRETURN(LOG_INPUT);
}
NOLOG_INPUT[[:blank:]]*: {
LEXTRACE("NOLOG_INPUT ");
- return NOLOG_INPUT;
+ LEXRETURN(NOLOG_INPUT);
}
<INITIAL,GOTDEFS>(\+|\%|\%:) {
/* empty group or netgroup */
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
\+{WORD} {
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("NETGROUP ");
- return NETGROUP;
+ LEXRETURN(NETGROUP);
}
\%:?({WORD}|{ID}) {
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("USERGROUP ");
- return USERGROUP;
+ LEXRETURN(USERGROUP);
}
{IPV4ADDR}(\/{IPV4ADDR})? {
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("NTWKADDR ");
- return NTWKADDR;
+ LEXRETURN(NTWKADDR);
}
{IPV4ADDR}\/([12]?[0-9]|3[0-2]) {
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("NTWKADDR ");
- return NTWKADDR;
+ LEXRETURN(NTWKADDR);
}
{IPV6ADDR}(\/{IPV6ADDR})? {
if (!ipv6_valid(yytext)) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("NTWKADDR ");
- return NTWKADDR;
+ LEXRETURN(NTWKADDR);
}
{IPV6ADDR}\/([0-9]|[1-9][0-9]|1[01][0-9]|12[0-8]) {
if (!ipv6_valid(yytext)) {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("NTWKADDR ");
- return NTWKADDR;
+ LEXRETURN(NTWKADDR);
}
ALL {
LEXTRACE("ALL ");
- return ALL;
+ LEXRETURN(ALL);
}
<INITIAL>ROLE {
#ifdef HAVE_SELINUX
LEXTRACE("ROLE ");
- return ROLE;
+ LEXRETURN(ROLE);
#else
goto got_alias;
#endif
<INITIAL>TYPE {
#ifdef HAVE_SELINUX
LEXTRACE("TYPE ");
- return TYPE;
+ LEXRETURN(TYPE);
#else
goto got_alias;
#endif
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("ALIAS ");
- return ALIAS;
+ LEXRETURN(ALIAS);
}
<GOTDEFS>({PATH}|sudoedit) {
if (!fill_cmnd(yytext, yyleng))
yyterminate();
LEXTRACE("COMMAND ");
- return COMMAND;
+ LEXRETURN(COMMAND);
}
sudoedit {
LEXTRACE("COMMAND ");
if (!fill_cmnd(yytext, yyleng))
yyterminate();
- return COMMAND;
+ LEXRETURN(COMMAND);
} else {
BEGIN GOTCMND;
LEXTRACE("COMMAND ");
if (!fill(yytext, yyleng))
yyterminate();
LEXTRACE("WORD(5) ");
- return WORD;
+ LEXRETURN(WORD);
}
\( {
LEXTRACE("( ");
- return '(';
+ LEXRETURN('(');
}
\) {
LEXTRACE(") ");
- return ')';
+ LEXRETURN(')');
}
, {
LEXTRACE(", ");
- return ',';
+ LEXRETURN(',');
} /* return ',' */
= {
LEXTRACE("= ");
- return '=';
+ LEXRETURN('=');
} /* return '=' */
: {
LEXTRACE(": ");
- return ':';
+ LEXRETURN(':');
} /* return ':' */
<*>!+ {
if (yyleng & 1) {
LEXTRACE("!");
- return '!'; /* return '!' */
+ LEXRETURN('!'); /* return '!' */
}
}
<*>\n {
if (YY_START == INSTR) {
LEXTRACE("ERROR ");
- return ERROR; /* line break in string */
+ LEXRETURN(ERROR); /* line break in string */
}
BEGIN INITIAL;
- ++sudolineno;
+ sudolineno++;
continued = FALSE;
LEXTRACE("\n");
- return COMMENT;
+ LEXRETURN(COMMENT);
} /* return newline */
<*>[[:blank:]]+ { /* throw away space/tabs */
<*>\\[[:blank:]]*\n {
sawspace = TRUE; /* remember for fill_args */
- ++sudolineno;
+ sudolineno++;
continued = TRUE;
} /* throw away EOL after \ */
<INITIAL,STARTDEFS,INDEFS>#(-[^\n0-9].*|[^\n0-9-].*)?\n {
BEGIN INITIAL;
- ++sudolineno;
+ sudolineno++;
continued = FALSE;
LEXTRACE("#\n");
- return COMMENT;
+ LEXRETURN(COMMENT);
} /* comment, not uid/gid */
<*>. {
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
} /* parse error */
<*><<EOF>> {
if (YY_START != INITIAL) {
BEGIN INITIAL;
LEXTRACE("ERROR ");
- return ERROR;
+ LEXRETURN(ERROR);
}
if (!pop_include())
yyterminate();