#endif
parse_error = TRUE;
}
-#line 173 "parse.yacc"
+#line 172 "parse.yacc"
typedef union {
char *string;
int BOOLEAN;
struct sudo_command command;
int tok;
} YYSTYPE;
-#line 197 "sudo.tab.c"
+#line 196 "sudo.tab.c"
#define ALIAS 257
#define NTWKADDR 258
#define FQHOST 259
short *yysslim;
YYSTYPE *yyvs;
int yystacksize;
-#line 662 "parse.yacc"
+#line 666 "parse.yacc"
typedef struct {
if (printmatches == TRUE)
expand_match_list();
}
-#line 891 "sudo.tab.c"
+#line 890 "sudo.tab.c"
/* allocate initial stack or double stack size, up to YYMAXDEPTH */
#if defined(__cplusplus) || __STDC__
static int yygrowstack(void)
switch (yyn)
{
case 3:
-#line 211 "parse.yacc"
+#line 210 "parse.yacc"
{ ; }
break;
case 4:
-#line 213 "parse.yacc"
+#line 212 "parse.yacc"
{ yyerrok; }
break;
case 5:
-#line 214 "parse.yacc"
+#line 213 "parse.yacc"
{ push; }
break;
case 6:
-#line 214 "parse.yacc"
+#line 213 "parse.yacc"
{
while (top && user_matches != TRUE) {
pop;
}
break;
case 7:
-#line 220 "parse.yacc"
+#line 219 "parse.yacc"
{ ; }
break;
case 8:
-#line 222 "parse.yacc"
+#line 221 "parse.yacc"
{ ; }
break;
case 9:
-#line 224 "parse.yacc"
+#line 223 "parse.yacc"
{ ; }
break;
case 10:
-#line 226 "parse.yacc"
+#line 225 "parse.yacc"
{ ; }
break;
case 13:
-#line 234 "parse.yacc"
+#line 233 "parse.yacc"
{
/*
* We already did a push if necessary in
}
break;
case 15:
-#line 247 "parse.yacc"
+#line 246 "parse.yacc"
{
push;
}
break;
case 16:
-#line 249 "parse.yacc"
+#line 248 "parse.yacc"
{
pop;
if (host_matched == TRUE)
}
break;
case 17:
-#line 257 "parse.yacc"
+#line 256 "parse.yacc"
{
host_matches = TRUE;
}
break;
case 18:
-#line 260 "parse.yacc"
+#line 259 "parse.yacc"
{
if (addr_matches(yyvsp[0].string))
host_matches = TRUE;
}
break;
case 19:
-#line 265 "parse.yacc"
+#line 264 "parse.yacc"
{
if (netgr_matches(yyvsp[0].string, host, NULL))
host_matches = TRUE;
}
break;
case 20:
-#line 270 "parse.yacc"
+#line 269 "parse.yacc"
{
if (strcasecmp(shost, yyvsp[0].string) == 0)
host_matches = TRUE;
}
break;
case 21:
-#line 275 "parse.yacc"
+#line 274 "parse.yacc"
{
if (strcasecmp(host, yyvsp[0].string) == 0)
host_matches = TRUE;
}
break;
case 22:
-#line 280 "parse.yacc"
+#line 279 "parse.yacc"
{
/* could be an all-caps hostname */
if (find_alias(yyvsp[0].string, HOST_ALIAS) == TRUE ||
}
break;
case 25:
-#line 293 "parse.yacc"
+#line 292 "parse.yacc"
{
if (printmatches == TRUE &&
(runas_matches == -1 || cmnd_matches == -1)) {
}
/*
* Push the entry onto the stack if it is worth
- * saving and clear match status.
+ * saving (or if nothing else is on the stack)
+ * and clear match status.
*/
- if (user_matches == TRUE && host_matches == TRUE &&
- cmnd_matches != -1 && runas_matches == TRUE)
+ if ((user_matches == TRUE && host_matches == TRUE &&
+ cmnd_matches != -1 && runas_matches != -1) ||
+ top == 1)
pushcp;
cmnd_matches = -1;
}
break;
case 26:
-#line 311 "parse.yacc"
+#line 312 "parse.yacc"
{ ; }
break;
case 27:
-#line 312 "parse.yacc"
+#line 313 "parse.yacc"
{
if (printmatches == TRUE && host_matches == TRUE &&
user_matches == TRUE) {
}
break;
case 28:
-#line 324 "parse.yacc"
+#line 325 "parse.yacc"
{
pop;
if (cmnd_matched == TRUE)
}
break;
case 29:
-#line 334 "parse.yacc"
+#line 335 "parse.yacc"
{
/*
* If this is the first entry in a command list
}
break;
case 30:
-#line 343 "parse.yacc"
+#line 344 "parse.yacc"
{ ; }
break;
case 33:
-#line 350 "parse.yacc"
+#line 351 "parse.yacc"
{
if (printmatches == TRUE && host_matches == TRUE &&
user_matches == TRUE)
}
break;
case 34:
-#line 357 "parse.yacc"
+#line 358 "parse.yacc"
{
if (printmatches == TRUE && host_matches == TRUE &&
user_matches == TRUE) {
}
break;
case 35:
-#line 367 "parse.yacc"
+#line 368 "parse.yacc"
{
pop;
+ /*
+ * Don't negate FALSE -> TRUE since that would
+ * make !foo match any time the user specified
+ * a runas user (via -u) other than foo.
+ */
if (runas_matched == TRUE)
runas_matches = FALSE;
- else if (runas_matched == FALSE)
- runas_matches = TRUE;
}
break;
case 36:
-#line 375 "parse.yacc"
+#line 379 "parse.yacc"
{
runas_matches = (strcmp(yyvsp[0].string, runas_user) == 0);
if (printmatches == TRUE && in_alias == TRUE)
}
break;
case 37:
-#line 388 "parse.yacc"
+#line 392 "parse.yacc"
{
runas_matches = usergr_matches(yyvsp[0].string, runas_user);
if (printmatches == TRUE && in_alias == TRUE)
}
break;
case 38:
-#line 402 "parse.yacc"
+#line 406 "parse.yacc"
{
runas_matches = netgr_matches(yyvsp[0].string, NULL, runas_user);
if (printmatches == TRUE && in_alias == TRUE)
}
break;
case 39:
-#line 416 "parse.yacc"
+#line 420 "parse.yacc"
{
/* could be an all-caps username */
if (find_alias(yyvsp[0].string, RUNAS_ALIAS) == TRUE ||
}
break;
case 40:
-#line 434 "parse.yacc"
+#line 438 "parse.yacc"
{
runas_matches = TRUE;
if (printmatches == TRUE && in_alias == TRUE)
}
break;
case 41:
-#line 448 "parse.yacc"
+#line 452 "parse.yacc"
{
;
}
break;
case 42:
-#line 451 "parse.yacc"
+#line 455 "parse.yacc"
{
no_passwd = TRUE;
if (printmatches == TRUE && host_matches == TRUE &&
}
break;
case 43:
-#line 457 "parse.yacc"
+#line 461 "parse.yacc"
{
no_passwd = FALSE;
if (printmatches == TRUE && host_matches == TRUE &&
}
break;
case 44:
-#line 465 "parse.yacc"
+#line 469 "parse.yacc"
{
if (printmatches == TRUE && in_alias == TRUE) {
append("ALL", &ga_list[ga_list_len-1].entries,
}
break;
case 45:
-#line 484 "parse.yacc"
+#line 488 "parse.yacc"
{
if (printmatches == TRUE && in_alias == TRUE) {
append(yyvsp[0].string, &ga_list[ga_list_len-1].entries,
}
break;
case 46:
-#line 503 "parse.yacc"
+#line 507 "parse.yacc"
{
if (printmatches == TRUE && in_alias == TRUE) {
append(yyvsp[0].command.cmnd, &ga_list[ga_list_len-1].entries,
}
break;
case 49:
-#line 542 "parse.yacc"
+#line 546 "parse.yacc"
{ push; }
break;
case 50:
-#line 542 "parse.yacc"
+#line 546 "parse.yacc"
{
if (host_matches == TRUE &&
add_alias(yyvsp[-3].string, HOST_ALIAS) == FALSE)
}
break;
case 55:
-#line 558 "parse.yacc"
+#line 562 "parse.yacc"
{
push;
if (printmatches == TRUE) {
}
break;
case 56:
-#line 566 "parse.yacc"
+#line 570 "parse.yacc"
{
if (cmnd_matches == TRUE &&
add_alias(yyvsp[-3].string, CMND_ALIAS) == FALSE)
}
break;
case 57:
-#line 578 "parse.yacc"
+#line 582 "parse.yacc"
{ ; }
break;
case 61:
-#line 586 "parse.yacc"
+#line 590 "parse.yacc"
{
push;
if (printmatches == TRUE) {
}
break;
case 62:
-#line 594 "parse.yacc"
+#line 598 "parse.yacc"
{
if (runas_matches > 0 &&
add_alias(yyvsp[-3].string, RUNAS_ALIAS) == FALSE)
}
break;
case 65:
-#line 610 "parse.yacc"
+#line 614 "parse.yacc"
{ push; }
break;
case 66:
-#line 610 "parse.yacc"
+#line 614 "parse.yacc"
{
if (user_matches == TRUE &&
add_alias(yyvsp[-3].string, USER_ALIAS) == FALSE)
}
break;
case 67:
-#line 619 "parse.yacc"
+#line 623 "parse.yacc"
{ ; }
break;
case 70:
-#line 624 "parse.yacc"
+#line 628 "parse.yacc"
{
push;
}
break;
case 71:
-#line 626 "parse.yacc"
+#line 630 "parse.yacc"
{
pop;
if (user_matched == TRUE)
}
break;
case 72:
-#line 634 "parse.yacc"
+#line 638 "parse.yacc"
{
if (strcmp(yyvsp[0].string, user_name) == 0)
user_matches = TRUE;
}
break;
case 73:
-#line 639 "parse.yacc"
+#line 643 "parse.yacc"
{
if (usergr_matches(yyvsp[0].string, user_name))
user_matches = TRUE;
}
break;
case 74:
-#line 644 "parse.yacc"
+#line 648 "parse.yacc"
{
if (netgr_matches(yyvsp[0].string, NULL, user_name))
user_matches = TRUE;
}
break;
case 75:
-#line 649 "parse.yacc"
+#line 653 "parse.yacc"
{
/* could be an all-caps username */
if (find_alias(yyvsp[0].string, USER_ALIAS) == TRUE ||
}
break;
case 76:
-#line 656 "parse.yacc"
+#line 660 "parse.yacc"
{
user_matches = TRUE;
}
break;
-#line 1615 "sudo.tab.c"
+#line 1619 "sudo.tab.c"
}
yyssp -= yym;
yystate = *yyssp;