int top = 0, stacksize = 0;
#define push \
- { \
+ do { \
if (top >= stacksize) { \
while ((stacksize += STACKINCREMENT) < top); \
match = (struct matchstack *) erealloc(match, sizeof(struct matchstack) * stacksize); \
match[top].runas = -1; \
match[top].nopass = pwdef; \
top++; \
- }
+ } while (0)
#define pushcp \
- { \
+ do { \
if (top >= stacksize) { \
while ((stacksize += STACKINCREMENT) < top); \
match = (struct matchstack *) erealloc(match, sizeof(struct matchstack) * stacksize); \
match[top].runas = match[top-1].runas; \
match[top].nopass = match[top-1].nopass; \
top++; \
- }
+ } while (0)
#define pop \
{ \
short *yysslim;
YYSTYPE *yyvs;
int yystacksize;
-#line 759 "./parse.yacc"
+#line 767 "./parse.yacc"
#define MOREALIASES (32)
aliasinfo *aliases = NULL;
{
/*
* Push the entry onto the stack if it is worth
- * saving (or if nothing else is on the stack)
- * and clear match status.
+ * saving and clear cmnd_matches for next cmnd.
+ *
+ * We need to save at least one entry on
+ * the stack so sudoers_lookup() can tell that
+ * the user was listed in sudoers. Also, we
+ * need to be able to tell whether or not a
+ * user was listed for this specific host.
*/
- if (user_matches == TRUE && host_matches == TRUE &&
- ((cmnd_matches != -1 && runas_matches != -1) ||
- top == 1))
+ if (user_matches != -1 && host_matches != -1 &&
+ cmnd_matches != -1 && runas_matches != -1)
+ pushcp;
+ else if (user_matches != -1 && (top == 1 ||
+ (top == 2 && host_matches != -1 &&
+ match[0].host == -1)))
pushcp;
cmnd_matches = -1;
}
break;
case 25:
-#line 372 "./parse.yacc"
+#line 380 "./parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
cmnd_matches = yyvsp[0].BOOLEAN;
}
break;
case 26:
-#line 376 "./parse.yacc"
+#line 384 "./parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 27:
-#line 384 "./parse.yacc"
+#line 392 "./parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
cmnd_matches = ! yyvsp[0].BOOLEAN;
}
break;
case 28:
-#line 390 "./parse.yacc"
+#line 398 "./parse.yacc"
{
if (printmatches == TRUE && host_matches == TRUE &&
user_matches == TRUE) {
}
break;
case 29:
-#line 413 "./parse.yacc"
+#line 421 "./parse.yacc"
{ ; }
break;
case 32:
-#line 420 "./parse.yacc"
+#line 428 "./parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
runas_matches = yyvsp[0].BOOLEAN;
}
break;
case 33:
-#line 424 "./parse.yacc"
+#line 432 "./parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 34:
-#line 432 "./parse.yacc"
+#line 440 "./parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
runas_matches = ! yyvsp[0].BOOLEAN;
}
break;
case 35:
-#line 437 "./parse.yacc"
+#line 445 "./parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 36:
-#line 451 "./parse.yacc"
+#line 459 "./parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 37:
-#line 465 "./parse.yacc"
+#line 473 "./parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 38:
-#line 479 "./parse.yacc"
+#line 487 "./parse.yacc"
{
aliasinfo *aip = find_alias(yyvsp[0].string, RUNAS_ALIAS);
}
break;
case 39:
-#line 508 "./parse.yacc"
+#line 516 "./parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 40:
-#line 520 "./parse.yacc"
+#line 528 "./parse.yacc"
{
/* Inherit NOPASSWD/PASSWD status. */
if (printmatches == TRUE && host_matches == TRUE &&
}
break;
case 41:
-#line 530 "./parse.yacc"
+#line 538 "./parse.yacc"
{
no_passwd = TRUE;
if (printmatches == TRUE && host_matches == TRUE &&
}
break;
case 42:
-#line 536 "./parse.yacc"
+#line 544 "./parse.yacc"
{
no_passwd = FALSE;
if (printmatches == TRUE && host_matches == TRUE &&
}
break;
case 43:
-#line 544 "./parse.yacc"
+#line 552 "./parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 44:
-#line 561 "./parse.yacc"
+#line 569 "./parse.yacc"
{
aliasinfo *aip;
}
break;
case 45:
-#line 590 "./parse.yacc"
+#line 598 "./parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE) {
}
break;
case 48:
-#line 622 "./parse.yacc"
+#line 630 "./parse.yacc"
{ push; }
break;
case 49:
-#line 622 "./parse.yacc"
+#line 630 "./parse.yacc"
{
if ((host_matches != -1 || pedantic) &&
!add_alias(yyvsp[-3].string, HOST_ALIAS, host_matches))
}
break;
case 54:
-#line 638 "./parse.yacc"
+#line 646 "./parse.yacc"
{
push;
if (printmatches == TRUE) {
}
break;
case 55:
-#line 646 "./parse.yacc"
+#line 654 "./parse.yacc"
{
if ((cmnd_matches != -1 || pedantic) &&
!add_alias(yyvsp[-3].string, CMND_ALIAS, cmnd_matches))
}
break;
case 56:
-#line 658 "./parse.yacc"
+#line 666 "./parse.yacc"
{ ; }
break;
case 60:
-#line 666 "./parse.yacc"
+#line 674 "./parse.yacc"
{
push;
if (printmatches == TRUE) {
}
break;
case 61:
-#line 674 "./parse.yacc"
+#line 682 "./parse.yacc"
{
if ((runas_matches != -1 || pedantic) &&
!add_alias(yyvsp[-3].string, RUNAS_ALIAS, runas_matches))
}
break;
case 64:
-#line 690 "./parse.yacc"
+#line 698 "./parse.yacc"
{ push; }
break;
case 65:
-#line 690 "./parse.yacc"
+#line 698 "./parse.yacc"
{
if ((user_matches != -1 || pedantic) &&
!add_alias(yyvsp[-3].string, USER_ALIAS, user_matches))
}
break;
case 66:
-#line 699 "./parse.yacc"
+#line 707 "./parse.yacc"
{ ; }
break;
case 68:
-#line 703 "./parse.yacc"
+#line 711 "./parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
user_matches = yyvsp[0].BOOLEAN;
}
break;
case 69:
-#line 707 "./parse.yacc"
+#line 715 "./parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
user_matches = ! yyvsp[0].BOOLEAN;
}
break;
case 70:
-#line 712 "./parse.yacc"
+#line 720 "./parse.yacc"
{
if (strcmp(yyvsp[0].string, user_name) == 0)
yyval.BOOLEAN = TRUE;
}
break;
case 71:
-#line 719 "./parse.yacc"
+#line 727 "./parse.yacc"
{
if (usergr_matches(yyvsp[0].string, user_name))
yyval.BOOLEAN = TRUE;
}
break;
case 72:
-#line 726 "./parse.yacc"
+#line 734 "./parse.yacc"
{
if (netgr_matches(yyvsp[0].string, NULL, user_name))
yyval.BOOLEAN = TRUE;
}
break;
case 73:
-#line 733 "./parse.yacc"
+#line 741 "./parse.yacc"
{
aliasinfo *aip = find_alias(yyvsp[0].string, USER_ALIAS);
}
break;
case 74:
-#line 753 "./parse.yacc"
+#line 761 "./parse.yacc"
{
yyval.BOOLEAN = TRUE;
}
break;
-#line 1660 "sudo.tab.c"
+#line 1668 "sudo.tab.c"
}
yyssp -= yym;
yystate = *yyssp;