Annotation of embedaddon/sudo/plugins/sudoers/gram.c, revision 1.1.1.1

1.1       misho       1: #include <config.h>
                      2: #include <stdlib.h>
                      3: #include <string.h>
                      4: #define YYBYACC 1
                      5: #define YYMAJOR 1
                      6: #define YYMINOR 9
                      7: #define YYLEX yylex()
                      8: #define YYEMPTY -1
                      9: #define yyclearin (yychar=(YYEMPTY))
                     10: #define yyerrok (yyerrflag=0)
                     11: #define YYRECOVERING() (yyerrflag!=0)
                     12: #define YYPREFIX "yy"
                     13: #line 2 "gram.y"
                     14: /*
                     15:  * Copyright (c) 1996, 1998-2005, 2007-2011
                     16:  *     Todd C. Miller <Todd.Miller@courtesan.com>
                     17:  *
                     18:  * Permission to use, copy, modify, and distribute this software for any
                     19:  * purpose with or without fee is hereby granted, provided that the above
                     20:  * copyright notice and this permission notice appear in all copies.
                     21:  *
                     22:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     23:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     24:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     25:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     26:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     27:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     28:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     29:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
                     30:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     31:  *
                     32:  * Sponsored in part by the Defense Advanced Research Projects
                     33:  * Agency (DARPA) and Air Force Research Laboratory, Air Force
                     34:  * Materiel Command, USAF, under agreement number F39502-99-1-0512.
                     35:  */
                     36: 
                     37: #include <config.h>
                     38: 
                     39: #include <sys/types.h>
                     40: #include <sys/param.h>
                     41: #include <stdio.h>
                     42: #ifdef STDC_HEADERS
                     43: # include <stdlib.h>
                     44: # include <stddef.h>
                     45: #else
                     46: # ifdef HAVE_STDLIB_H
                     47: #  include <stdlib.h>
                     48: # endif
                     49: #endif /* STDC_HEADERS */
                     50: #ifdef HAVE_STRING_H
                     51: # include <string.h>
                     52: #endif /* HAVE_STRING_H */
                     53: #ifdef HAVE_STRINGS_H
                     54: # include <strings.h>
                     55: #endif /* HAVE_STRINGS_H */
                     56: #ifdef HAVE_UNISTD_H
                     57: # include <unistd.h>
                     58: #endif /* HAVE_UNISTD_H */
                     59: #if defined(YYBISON) && defined(HAVE_ALLOCA_H) && !defined(__GNUC__)
                     60: # include <alloca.h>
                     61: #endif /* YYBISON && HAVE_ALLOCA_H && !__GNUC__ */
                     62: #include <limits.h>
                     63: 
                     64: #include "sudoers.h" /* XXX */
                     65: #include "parse.h"
                     66: #include "toke.h"
                     67: 
                     68: /*
                     69:  * We must define SIZE_MAX for yacc's skeleton.c.
                     70:  * If there is no SIZE_MAX or SIZE_T_MAX we have to assume that size_t
                     71:  * could be signed (as it is on SunOS 4.x).
                     72:  */
                     73: #ifndef SIZE_MAX
                     74: # ifdef SIZE_T_MAX
                     75: #  define SIZE_MAX     SIZE_T_MAX
                     76: # else
                     77: #  define SIZE_MAX     INT_MAX
                     78: # endif /* SIZE_T_MAX */
                     79: #endif /* SIZE_MAX */
                     80: 
                     81: /*
                     82:  * Globals
                     83:  */
                     84: extern int sudolineno;
                     85: extern char *sudoers;
                     86: static int verbose = FALSE;
                     87: int parse_error = FALSE;
                     88: int pedantic = FALSE;
                     89: int errorlineno = -1;
                     90: char *errorfile = NULL;
                     91: 
                     92: struct defaults_list defaults;
                     93: struct userspec_list userspecs;
                     94: 
                     95: /*
                     96:  * Local protoypes
                     97:  */
                     98: static void  add_defaults(int, struct member *, struct defaults *);
                     99: static void  add_userspec(struct member *, struct privilege *);
                    100: static struct defaults *new_default(char *, char *, int);
                    101: static struct member *new_member(char *, int);
                    102:        void  yyerror(const char *);
                    103: 
                    104: void
                    105: yyerror(const char *s)
                    106: {
                    107:     /* Save the line the first error occurred on. */
                    108:     if (errorlineno == -1) {
                    109:        errorlineno = sudolineno ? sudolineno - 1 : 0;
                    110:        errorfile = estrdup(sudoers);
                    111:     }
                    112:     if (trace_print != NULL) {
                    113:        LEXTRACE("<*> ");
                    114:     } else if (verbose && s != NULL) {
                    115:        warningx(_(">>> %s: %s near line %d <<<"), sudoers, s,
                    116:            sudolineno ? sudolineno - 1 : 0);
                    117:     }
                    118:     parse_error = TRUE;
                    119: }
                    120: #line 110 "gram.y"
                    121: #ifndef YYSTYPE_DEFINED
                    122: #define YYSTYPE_DEFINED
                    123: typedef union {
                    124:     struct cmndspec *cmndspec;
                    125:     struct defaults *defaults;
                    126:     struct member *member;
                    127:     struct runascontainer *runas;
                    128:     struct privilege *privilege;
                    129:     struct sudo_command command;
                    130:     struct cmndtag tag;
                    131:     struct selinux_info seinfo;
                    132:     char *string;
                    133:     int tok;
                    134: } YYSTYPE;
                    135: #endif /* YYSTYPE_DEFINED */
                    136: #line 136 "y.tab.c"
                    137: #define COMMAND 257
                    138: #define ALIAS 258
                    139: #define DEFVAR 259
                    140: #define NTWKADDR 260
                    141: #define NETGROUP 261
                    142: #define USERGROUP 262
                    143: #define WORD 263
                    144: #define DEFAULTS 264
                    145: #define DEFAULTS_HOST 265
                    146: #define DEFAULTS_USER 266
                    147: #define DEFAULTS_RUNAS 267
                    148: #define DEFAULTS_CMND 268
                    149: #define NOPASSWD 269
                    150: #define PASSWD 270
                    151: #define NOEXEC 271
                    152: #define EXEC 272
                    153: #define SETENV 273
                    154: #define NOSETENV 274
                    155: #define LOG_INPUT 275
                    156: #define NOLOG_INPUT 276
                    157: #define LOG_OUTPUT 277
                    158: #define NOLOG_OUTPUT 278
                    159: #define ALL 279
                    160: #define COMMENT 280
                    161: #define HOSTALIAS 281
                    162: #define CMNDALIAS 282
                    163: #define USERALIAS 283
                    164: #define RUNASALIAS 284
                    165: #define ERROR 285
                    166: #define TYPE 286
                    167: #define ROLE 287
                    168: #define YYERRCODE 256
                    169: #if defined(__cplusplus) || defined(__STDC__)
                    170: const short yylhs[] =
                    171: #else
                    172: short yylhs[] =
                    173: #endif
                    174:        {                                        -1,
                    175:     0,    0,   25,   25,   26,   26,   26,   26,   26,   26,
                    176:    26,   26,   26,   26,   26,   26,    4,    4,    3,    3,
                    177:     3,    3,    3,   20,   20,   19,   10,   10,    8,    8,
                    178:     8,    8,    8,    2,    2,    1,    6,    6,   23,   24,
                    179:    22,   22,   22,   22,   22,   17,   17,   18,   18,   18,
                    180:    21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
                    181:    21,    5,    5,    5,   28,   28,   31,    9,    9,   29,
                    182:    29,   32,    7,    7,   30,   30,   33,   27,   27,   34,
                    183:    13,   13,   11,   11,   12,   12,   12,   12,   12,   16,
                    184:    16,   14,   14,   15,   15,   15,
                    185: };
                    186: #if defined(__cplusplus) || defined(__STDC__)
                    187: const short yylen[] =
                    188: #else
                    189: short yylen[] =
                    190: #endif
                    191:        {                                         2,
                    192:     0,    1,    1,    2,    1,    2,    2,    2,    2,    2,
                    193:     2,    2,    3,    3,    3,    3,    1,    3,    1,    2,
                    194:     3,    3,    3,    1,    3,    3,    1,    2,    1,    1,
                    195:     1,    1,    1,    1,    3,    4,    1,    2,    3,    3,
                    196:     0,    1,    1,    2,    2,    0,    3,    1,    3,    2,
                    197:     0,    2,    2,    2,    2,    2,    2,    2,    2,    2,
                    198:     2,    1,    1,    1,    1,    3,    3,    1,    3,    1,
                    199:     3,    3,    1,    3,    1,    3,    3,    1,    3,    3,
                    200:     1,    3,    1,    2,    1,    1,    1,    1,    1,    1,
                    201:     3,    1,    2,    1,    1,    1,
                    202: };
                    203: #if defined(__cplusplus) || defined(__STDC__)
                    204: const short yydefred[] =
                    205: #else
                    206: short yydefred[] =
                    207: #endif
                    208:        {                                      0,
                    209:     0,   85,   87,   88,   89,    0,    0,    0,    0,    0,
                    210:    86,    5,    0,    0,    0,    0,    0,    0,   81,   83,
                    211:     0,    0,    3,    6,    0,    0,   17,    0,   29,   32,
                    212:    31,   33,   30,    0,   27,    0,   68,    0,    0,   64,
                    213:    63,   62,    0,   37,   73,    0,    0,    0,   65,    0,
                    214:     0,   70,    0,    0,   78,    0,    0,   75,   84,    0,
                    215:     0,   24,    0,    4,    0,    0,    0,   20,    0,   28,
                    216:     0,    0,    0,    0,   38,    0,    0,    0,    0,    0,
                    217:     0,    0,    0,    0,    0,   82,    0,    0,   21,   22,
                    218:    23,   18,   69,   74,    0,   66,    0,   71,    0,   79,
                    219:     0,   76,    0,   34,    0,    0,   25,    0,    0,    0,
                    220:     0,    0,    0,   51,    0,    0,   94,   96,   95,    0,
                    221:    90,   92,    0,    0,   47,   35,    0,    0,    0,   44,
                    222:    45,   93,    0,    0,   40,   39,   52,   53,   54,   55,
                    223:    56,   57,   58,   59,   60,   61,   36,   91,
                    224: };
                    225: #if defined(__cplusplus) || defined(__STDC__)
                    226: const short yydgoto[] =
                    227: #else
                    228: short yydgoto[] =
                    229: #endif
                    230:        {                                      18,
                    231:   104,  105,   27,   28,   44,   45,   46,   35,   61,   37,
                    232:    19,   20,   21,  121,  122,  123,  106,  110,   62,   63,
                    233:   129,  114,  115,  116,   22,   23,   54,   48,   51,   57,
                    234:    49,   52,   58,   55,
                    235: };
                    236: #if defined(__cplusplus) || defined(__STDC__)
                    237: const short yysindex[] =
                    238: #else
                    239: short yysindex[] =
                    240: #endif
                    241:        {                                    475,
                    242:  -270,    0,    0,    0,    0,  -29,  567,  594,  594,   -2,
                    243:     0,    0, -240, -222, -216, -212, -241,    0,    0,    0,
                    244:   -25,  475,    0,    0,  -10, -207,    0,    9,    0,    0,
                    245:     0,    0,    0, -235,    0,  -33,    0,  -31,  -31,    0,
                    246:     0,    0, -242,    0,    0,  -30,   -7,    3,    0,   -6,
                    247:     4,    0,   -5,    6,    0,   -1,    8,    0,    0,  594,
                    248:   -20,    0,   10,    0, -205, -196, -194,    0,  -29,    0,
                    249:   567,    9,    9,    9,    0,   -2,    9,  567, -240,   -2,
                    250:  -222,  594, -216,  594, -212,    0,   31,  567,    0,    0,
                    251:     0,    0,    0,    0,   26,    0,   28,    0,   29,    0,
                    252:    29,    0,  541,    0,   32, -247,    0,   86,  -15,   33,
                    253:    31,   14,   16,    0, -208, -204,    0,    0,    0, -231,
                    254:     0,    0,   38,   86,    0,    0, -179, -178,  491,    0,
                    255:     0,    0,   86,   38,    0,    0,    0,    0,    0,    0,
                    256:     0,    0,    0,    0,    0,    0,    0,    0,};
                    257: #if defined(__cplusplus) || defined(__STDC__)
                    258: const short yyrindex[] =
                    259: #else
                    260: short yyrindex[] =
                    261: #endif
                    262:        {                                     87,
                    263:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    264:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    265:     0,   90,    0,    0,    1,    0,    0,  177,    0,    0,
                    266:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    267:     0,    0,    0,    0,    0,    0,    0,  207,    0,    0,
                    268:   237,    0,    0,  271,    0,    0,  300,    0,    0,    0,
                    269:     0,    0,  329,    0,    0,    0,    0,    0,    0,    0,
                    270:     0,  358,  387,  417,    0,    0,  446,    0,    0,    0,
                    271:     0,    0,    0,    0,    0,    0,  -26,    0,    0,    0,
                    272:     0,    0,    0,    0,   30,    0,   59,    0,   89,    0,
                    273:   118,    0,    0,    0,  148,  514,    0,    0,   45,    0,
                    274:   -26,    0,    0,    0,  537,  565,    0,    0,    0,    0,
                    275:     0,    0,   50,    0,    0,    0,    0,    0,    0,    0,
                    276:     0,    0,    0,   52,    0,    0,    0,    0,    0,    0,
                    277:     0,    0,    0,    0,    0,    0,    0,    0,};
                    278: #if defined(__cplusplus) || defined(__STDC__)
                    279: const short yygindex[] =
                    280: #else
                    281: short yygindex[] =
                    282: #endif
                    283:        {                                      0,
                    284:   -17,    0,   27,   11,   54,  -64,   15,   64,    2,   34,
                    285:    39,   84,   -3,  -27,  -18,  -21,    0,    0,   19,    0,
                    286:     0,    0,  -12,   -4,    0,   88,    0,    0,    0,    0,
                    287:    35,   40,   23,   37,
                    288: };
                    289: #define YYTABLESIZE 873
                    290: #if defined(__cplusplus) || defined(__STDC__)
                    291: const short yytable[] =
                    292: #else
                    293: short yytable[] =
                    294: #endif
                    295:        {                                      26,
                    296:    19,   26,   26,   26,   38,   39,   46,   34,   36,   24,
                    297:    71,   94,   60,   76,   40,   41,    2,   47,   60,    3,
                    298:     4,    5,   29,   71,   30,   31,  117,   32,   60,   67,
                    299:    43,  118,   66,   19,   67,   50,   42,   11,  112,  113,
                    300:    87,   53,  124,   33,   19,   56,   72,  119,   73,   74,
                    301:    65,   68,   69,   78,   80,   82,   77,   89,   72,   84,
                    302:    79,   81,   67,   83,  147,   85,   90,   88,   91,   71,
                    303:   103,   76,   60,  125,  127,  111,  128,  112,   99,   95,
                    304:   101,  133,  113,  135,  136,   48,    1,   67,   80,    2,
                    305:    50,   72,   49,  126,   97,   92,   75,   70,   86,  109,
                    306:    59,  132,  134,  131,   93,  148,  107,  102,    0,   64,
                    307:   130,    0,    0,   96,    0,    0,   72,   77,  120,  100,
                    308:    98,   80,    0,    0,    0,    0,    0,    0,    0,    0,
                    309:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    310:     0,    0,    0,    0,    0,    0,   80,   26,    0,    0,
                    311:    77,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    312:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    313:     0,    0,    0,    0,    0,   77,   12,    0,    0,    0,
                    314:    26,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    315:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    316:     0,    0,    0,    0,    0,   26,    9,    0,    0,   12,
                    317:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    318:     0,    0,    0,    0,    0,   25,    0,   25,   25,   25,
                    319:    46,   46,   29,    0,   30,   31,   10,   32,    0,    9,
                    320:     0,    0,   46,   46,   46,   46,   46,   46,   46,   46,
                    321:    46,   46,   46,   33,   40,   41,   19,    0,   19,   46,
                    322:    46,   19,   19,   19,   19,   19,   19,   19,   19,   10,
                    323:     8,    0,    0,    0,    0,    0,   42,    0,    0,   19,
                    324:    19,   19,   19,   19,   19,   67,    0,   67,    0,    0,
                    325:    67,   67,   67,   67,   67,   67,   67,   67,    0,   11,
                    326:     0,    0,    0,    8,    0,    0,    0,    0,   67,   67,
                    327:    67,   67,   67,   67,   72,    0,   72,    0,    0,   72,
                    328:    72,   72,   72,   72,   72,   72,   72,    0,    7,    0,
                    329:     0,    0,   11,    0,    0,    0,    0,   72,   72,   72,
                    330:    72,   72,   72,  117,   80,    0,   80,    0,  118,   80,
                    331:    80,   80,   80,   80,   80,   80,   80,   15,    0,    0,
                    332:     0,    7,    0,    0,  119,    0,    0,   80,   80,   80,
                    333:    80,   80,   80,   77,    0,   77,    0,    0,   77,   77,
                    334:    77,   77,   77,   77,   77,   77,   13,    0,    0,    0,
                    335:    15,    0,    0,    0,    0,    0,   77,   77,   77,   77,
                    336:    77,   77,    0,   26,    0,   26,    0,    0,   26,   26,
                    337:    26,   26,   26,   26,   26,   26,   14,    0,    0,   13,
                    338:     0,    0,    0,    0,    0,    0,   26,   26,   26,   26,
                    339:    26,   26,   12,    0,   12,    0,    0,   12,   12,   12,
                    340:    12,   12,   12,   12,   12,   16,    0,    0,    0,   14,
                    341:     0,    0,    0,    0,    0,   12,   12,   12,   12,   12,
                    342:    12,    0,    9,    0,    9,    0,    0,    9,    9,    9,
                    343:     9,    9,    9,    9,    9,    0,    0,    0,   16,    0,
                    344:     0,    0,    0,    0,    0,    9,    9,    9,    9,    9,
                    345:     9,    0,   10,    0,   10,    0,    0,   10,   10,   10,
                    346:    10,   10,   10,   10,   10,    0,    0,   17,    0,    0,
                    347:     0,    0,    0,    0,    0,   10,   10,   10,   10,   10,
                    348:    10,    0,    0,   43,    0,    0,    8,    0,    8,    0,
                    349:     0,    8,    8,    8,    8,    8,    8,    8,    8,    0,
                    350:     0,    0,    0,    0,    0,    0,   41,    0,    0,    8,
                    351:     8,    8,    8,    8,    8,   11,    0,   11,    0,    0,
                    352:    11,   11,   11,   11,   11,   11,   11,   11,    0,   42,
                    353:     0,    0,    0,   17,    0,    0,    0,    0,   11,   11,
                    354:    11,   11,   11,   11,    7,    0,    7,    0,    0,    7,
                    355:     7,    7,    7,    7,    7,    7,    7,   43,  108,   34,
                    356:     0,    0,    0,    0,    0,    0,    0,    7,    7,    7,
                    357:     7,    7,    7,   15,    0,   15,    0,    0,   15,   15,
                    358:    15,   15,   15,   15,   15,   15,   17,    0,    0,    0,
                    359:     0,    0,    0,    0,    0,    0,   15,   15,   15,   15,
                    360:    15,   15,   13,    0,   13,    0,    0,   13,   13,   13,
                    361:    13,   13,   13,   13,   13,    0,    0,    0,    0,    0,
                    362:     0,    0,    0,    0,    0,   13,   13,   13,   13,   13,
                    363:    13,    0,   14,    0,   14,    0,    0,   14,   14,   14,
                    364:    14,   14,   14,   14,   14,    0,    0,    0,    0,    0,
                    365:     0,    0,    0,    0,    0,   14,   14,   14,   14,   14,
                    366:    14,   16,    0,   16,    0,    0,   16,   16,   16,   16,
                    367:    16,   16,   16,   16,    0,    0,    0,    0,    0,    0,
                    368:     0,    0,    0,    0,   16,   16,   16,   16,   16,   16,
                    369:     1,    0,    2,    0,    0,    3,    4,    5,    6,    7,
                    370:     8,    9,   10,    0,    0,    0,    0,   40,   41,    0,
                    371:     0,    0,    0,   11,   12,   13,   14,   15,   16,  137,
                    372:   138,  139,  140,  141,  142,  143,  144,  145,  146,   42,
                    373:    41,   41,    0,    0,    0,    0,    0,    0,    0,    0,
                    374:     0,    0,   41,   41,   41,   41,   41,   41,   41,   41,
                    375:    41,   41,   41,   42,   42,    0,    0,    0,    2,    0,
                    376:     0,    3,    4,    5,    0,   42,   42,   42,   42,   42,
                    377:    42,   42,   42,   42,   42,   42,    0,    0,    0,   11,
                    378:     0,   43,   43,    0,   29,    0,   30,   31,    0,   32,
                    379:     0,    0,    0,   43,   43,   43,   43,   43,   43,   43,
                    380:    43,   43,   43,   43,    0,   33,    0,    0,    0,    0,
                    381:     0,    2,    0,    0,    3,    4,    5,    0,    0,    0,
                    382:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                    383:     0,    0,   11,
                    384: };
                    385: #if defined(__cplusplus) || defined(__STDC__)
                    386: const short yycheck[] =
                    387: #else
                    388: short yycheck[] =
                    389: #endif
                    390:        {                                      33,
                    391:     0,   33,   33,   33,    8,    9,   33,   33,    7,  280,
                    392:    44,   76,   44,   44,  257,  258,  258,  258,   44,  261,
                    393:   262,  263,  258,   44,  260,  261,  258,  263,   44,    0,
                    394:    33,  263,   43,   33,   45,  258,  279,  279,  286,  287,
                    395:    61,  258,   58,  279,   44,  258,   36,  279,   38,   39,
                    396:    61,  259,   44,   61,   61,   61,   46,  263,    0,   61,
                    397:    58,   58,   33,   58,  129,   58,  263,   58,  263,   44,
                    398:    40,   44,   44,   41,   61,   44,   61,  286,   82,   78,
                    399:    84,   44,  287,  263,  263,   41,    0,   58,    0,    0,
                    400:    41,   33,   41,  111,   80,   69,   43,   34,   60,  103,
                    401:    17,  120,  124,  116,   71,  133,   88,   85,   -1,   22,
                    402:   115,   -1,   -1,   79,   -1,   -1,   58,    0,   33,   83,
                    403:    81,   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
                    404:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
                    405:    -1,   -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,
                    406:    33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
                    407:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
                    408:    -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,   -1,
                    409:    33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
                    410:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
                    411:    -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,   33,
                    412:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
                    413:    -1,   -1,   -1,   -1,   -1,  259,   -1,  259,  259,  259,
                    414:   257,  258,  258,   -1,  260,  261,    0,  263,   -1,   33,
                    415:    -1,   -1,  269,  270,  271,  272,  273,  274,  275,  276,
                    416:   277,  278,  279,  279,  257,  258,  256,   -1,  258,  286,
                    417:   287,  261,  262,  263,  264,  265,  266,  267,  268,   33,
                    418:     0,   -1,   -1,   -1,   -1,   -1,  279,   -1,   -1,  279,
                    419:   280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
                    420:   261,  262,  263,  264,  265,  266,  267,  268,   -1,    0,
                    421:    -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
                    422:   281,  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,
                    423:   262,  263,  264,  265,  266,  267,  268,   -1,    0,   -1,
                    424:    -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,  281,
                    425:   282,  283,  284,  258,  256,   -1,  258,   -1,  263,  261,
                    426:   262,  263,  264,  265,  266,  267,  268,    0,   -1,   -1,
                    427:    -1,   33,   -1,   -1,  279,   -1,   -1,  279,  280,  281,
                    428:   282,  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,
                    429:   263,  264,  265,  266,  267,  268,    0,   -1,   -1,   -1,
                    430:    33,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
                    431:   283,  284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,
                    432:   263,  264,  265,  266,  267,  268,    0,   -1,   -1,   33,
                    433:    -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
                    434:   283,  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,
                    435:   264,  265,  266,  267,  268,    0,   -1,   -1,   -1,   33,
                    436:    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
                    437:   284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
                    438:   264,  265,  266,  267,  268,   -1,   -1,   -1,   33,   -1,
                    439:    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
                    440:   284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
                    441:   264,  265,  266,  267,  268,   -1,   -1,   33,   -1,   -1,
                    442:    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
                    443:   284,   -1,   -1,   33,   -1,   -1,  256,   -1,  258,   -1,
                    444:    -1,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
                    445:    -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,  279,
                    446:   280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
                    447:   261,  262,  263,  264,  265,  266,  267,  268,   -1,   33,
                    448:    -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
                    449:   281,  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,
                    450:   262,  263,  264,  265,  266,  267,  268,   33,   58,   33,
                    451:    -1,   -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,
                    452:   282,  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,
                    453:   263,  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,
                    454:    -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
                    455:   283,  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,
                    456:   264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
                    457:    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
                    458:   284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
                    459:   264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
                    460:    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
                    461:   284,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
                    462:   265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,   -1,
                    463:    -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,  284,
                    464:   256,   -1,  258,   -1,   -1,  261,  262,  263,  264,  265,
                    465:   266,  267,  268,   -1,   -1,   -1,   -1,  257,  258,   -1,
                    466:    -1,   -1,   -1,  279,  280,  281,  282,  283,  284,  269,
                    467:   270,  271,  272,  273,  274,  275,  276,  277,  278,  279,
                    468:   257,  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
                    469:    -1,   -1,  269,  270,  271,  272,  273,  274,  275,  276,
                    470:   277,  278,  279,  257,  258,   -1,   -1,   -1,  258,   -1,
                    471:    -1,  261,  262,  263,   -1,  269,  270,  271,  272,  273,
                    472:   274,  275,  276,  277,  278,  279,   -1,   -1,   -1,  279,
                    473:    -1,  257,  258,   -1,  258,   -1,  260,  261,   -1,  263,
                    474:    -1,   -1,   -1,  269,  270,  271,  272,  273,  274,  275,
                    475:   276,  277,  278,  279,   -1,  279,   -1,   -1,   -1,   -1,
                    476:    -1,  258,   -1,   -1,  261,  262,  263,   -1,   -1,   -1,
                    477:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
                    478:    -1,   -1,  279,
                    479: };
                    480: #define YYFINAL 18
                    481: #ifndef YYDEBUG
                    482: #define YYDEBUG 0
                    483: #endif
                    484: #define YYMAXTOKEN 287
                    485: #if YYDEBUG
                    486: #if defined(__cplusplus) || defined(__STDC__)
                    487: const char * const yyname[] =
                    488: #else
                    489: char *yyname[] =
                    490: #endif
                    491:        {
                    492: "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    493: "'!'",0,0,0,0,0,0,"'('","')'",0,"'+'","','","'-'",0,0,0,0,0,0,0,0,0,0,0,0,"':'",
                    494: 0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    495: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    496: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    497: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    498: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    499: "COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DEFAULTS",
                    500: "DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND","NOPASSWD",
                    501: "PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT","NOLOG_INPUT",
                    502: "LOG_OUTPUT","NOLOG_OUTPUT","ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS",
                    503: "RUNASALIAS","ERROR","TYPE","ROLE",
                    504: };
                    505: #if defined(__cplusplus) || defined(__STDC__)
                    506: const char * const yyrule[] =
                    507: #else
                    508: char *yyrule[] =
                    509: #endif
                    510:        {"$accept : file",
                    511: "file :",
                    512: "file : line",
                    513: "line : entry",
                    514: "line : line entry",
                    515: "entry : COMMENT",
                    516: "entry : error COMMENT",
                    517: "entry : userlist privileges",
                    518: "entry : USERALIAS useraliases",
                    519: "entry : HOSTALIAS hostaliases",
                    520: "entry : CMNDALIAS cmndaliases",
                    521: "entry : RUNASALIAS runasaliases",
                    522: "entry : DEFAULTS defaults_list",
                    523: "entry : DEFAULTS_USER userlist defaults_list",
                    524: "entry : DEFAULTS_RUNAS userlist defaults_list",
                    525: "entry : DEFAULTS_HOST hostlist defaults_list",
                    526: "entry : DEFAULTS_CMND cmndlist defaults_list",
                    527: "defaults_list : defaults_entry",
                    528: "defaults_list : defaults_list ',' defaults_entry",
                    529: "defaults_entry : DEFVAR",
                    530: "defaults_entry : '!' DEFVAR",
                    531: "defaults_entry : DEFVAR '=' WORD",
                    532: "defaults_entry : DEFVAR '+' WORD",
                    533: "defaults_entry : DEFVAR '-' WORD",
                    534: "privileges : privilege",
                    535: "privileges : privileges ':' privilege",
                    536: "privilege : hostlist '=' cmndspeclist",
                    537: "ophost : host",
                    538: "ophost : '!' host",
                    539: "host : ALIAS",
                    540: "host : ALL",
                    541: "host : NETGROUP",
                    542: "host : NTWKADDR",
                    543: "host : WORD",
                    544: "cmndspeclist : cmndspec",
                    545: "cmndspeclist : cmndspeclist ',' cmndspec",
                    546: "cmndspec : runasspec selinux cmndtag opcmnd",
                    547: "opcmnd : cmnd",
                    548: "opcmnd : '!' cmnd",
                    549: "rolespec : ROLE '=' WORD",
                    550: "typespec : TYPE '=' WORD",
                    551: "selinux :",
                    552: "selinux : rolespec",
                    553: "selinux : typespec",
                    554: "selinux : rolespec typespec",
                    555: "selinux : typespec rolespec",
                    556: "runasspec :",
                    557: "runasspec : '(' runaslist ')'",
                    558: "runaslist : userlist",
                    559: "runaslist : userlist ':' grouplist",
                    560: "runaslist : ':' grouplist",
                    561: "cmndtag :",
                    562: "cmndtag : cmndtag NOPASSWD",
                    563: "cmndtag : cmndtag PASSWD",
                    564: "cmndtag : cmndtag NOEXEC",
                    565: "cmndtag : cmndtag EXEC",
                    566: "cmndtag : cmndtag SETENV",
                    567: "cmndtag : cmndtag NOSETENV",
                    568: "cmndtag : cmndtag LOG_INPUT",
                    569: "cmndtag : cmndtag NOLOG_INPUT",
                    570: "cmndtag : cmndtag LOG_OUTPUT",
                    571: "cmndtag : cmndtag NOLOG_OUTPUT",
                    572: "cmnd : ALL",
                    573: "cmnd : ALIAS",
                    574: "cmnd : COMMAND",
                    575: "hostaliases : hostalias",
                    576: "hostaliases : hostaliases ':' hostalias",
                    577: "hostalias : ALIAS '=' hostlist",
                    578: "hostlist : ophost",
                    579: "hostlist : hostlist ',' ophost",
                    580: "cmndaliases : cmndalias",
                    581: "cmndaliases : cmndaliases ':' cmndalias",
                    582: "cmndalias : ALIAS '=' cmndlist",
                    583: "cmndlist : opcmnd",
                    584: "cmndlist : cmndlist ',' opcmnd",
                    585: "runasaliases : runasalias",
                    586: "runasaliases : runasaliases ':' runasalias",
                    587: "runasalias : ALIAS '=' userlist",
                    588: "useraliases : useralias",
                    589: "useraliases : useraliases ':' useralias",
                    590: "useralias : ALIAS '=' userlist",
                    591: "userlist : opuser",
                    592: "userlist : userlist ',' opuser",
                    593: "opuser : user",
                    594: "opuser : '!' user",
                    595: "user : ALIAS",
                    596: "user : ALL",
                    597: "user : NETGROUP",
                    598: "user : USERGROUP",
                    599: "user : WORD",
                    600: "grouplist : opgroup",
                    601: "grouplist : grouplist ',' opgroup",
                    602: "opgroup : group",
                    603: "opgroup : '!' group",
                    604: "group : ALIAS",
                    605: "group : ALL",
                    606: "group : WORD",
                    607: };
                    608: #endif
                    609: #ifdef YYSTACKSIZE
                    610: #undef YYMAXDEPTH
                    611: #define YYMAXDEPTH YYSTACKSIZE
                    612: #else
                    613: #ifdef YYMAXDEPTH
                    614: #define YYSTACKSIZE YYMAXDEPTH
                    615: #else
                    616: #define YYSTACKSIZE 10000
                    617: #define YYMAXDEPTH 10000
                    618: #endif
                    619: #endif
                    620: #define YYINITSTACKSIZE 200
                    621: /* LINTUSED */
                    622: int yydebug;
                    623: int yynerrs;
                    624: int yyerrflag;
                    625: int yychar;
                    626: short *yyssp;
                    627: YYSTYPE *yyvsp;
                    628: YYSTYPE yyval;
                    629: YYSTYPE yylval;
                    630: short *yyss;
                    631: short *yysslim;
                    632: YYSTYPE *yyvs;
                    633: int yystacksize;
                    634: #line 604 "gram.y"
                    635: static struct defaults *
                    636: new_default(char *var, char *val, int op)
                    637: {
                    638:     struct defaults *d;
                    639: 
                    640:     d = emalloc(sizeof(struct defaults));
                    641:     d->var = var;
                    642:     d->val = val;
                    643:     tq_init(&d->binding);
                    644:     d->type = 0;
                    645:     d->op = op;
                    646:     d->prev = d;
                    647:     d->next = NULL;
                    648: 
                    649:     return d;
                    650: }
                    651: 
                    652: static struct member *
                    653: new_member(char *name, int type)
                    654: {
                    655:     struct member *m;
                    656: 
                    657:     m = emalloc(sizeof(struct member));
                    658:     m->name = name;
                    659:     m->type = type;
                    660:     m->prev = m;
                    661:     m->next = NULL;
                    662: 
                    663:     return m;
                    664: }
                    665: 
                    666: /*
                    667:  * Add a list of defaults structures to the defaults list.
                    668:  * The binding, if non-NULL, specifies a list of hosts, users, or
                    669:  * runas users the entries apply to (specified by the type).
                    670:  */
                    671: static void
                    672: add_defaults(int type, struct member *bmem, struct defaults *defs)
                    673: {
                    674:     struct defaults *d;
                    675:     struct member_list binding;
                    676: 
                    677:     /*
                    678:      * We can only call list2tq once on bmem as it will zero
                    679:      * out the prev pointer when it consumes bmem.
                    680:      */
                    681:     list2tq(&binding, bmem);
                    682: 
                    683:     /*
                    684:      * Set type and binding (who it applies to) for new entries.
                    685:      */
                    686:     for (d = defs; d != NULL; d = d->next) {
                    687:        d->type = type;
                    688:        d->binding = binding;
                    689:     }
                    690:     tq_append(&defaults, defs);
                    691: }
                    692: 
                    693: /*
                    694:  * Allocate a new struct userspec, populate it, and insert it at the
                    695:  * and of the userspecs list.
                    696:  */
                    697: static void
                    698: add_userspec(struct member *members, struct privilege *privs)
                    699: {
                    700:     struct userspec *u;
                    701: 
                    702:     u = emalloc(sizeof(*u));
                    703:     list2tq(&u->users, members);
                    704:     list2tq(&u->privileges, privs);
                    705:     u->prev = u;
                    706:     u->next = NULL;
                    707:     tq_append(&userspecs, u);
                    708: }
                    709: 
                    710: /*
                    711:  * Free up space used by data structures from a previous parser run and sets
                    712:  * the current sudoers file to path.
                    713:  */
                    714: void
                    715: init_parser(const char *path, int quiet)
                    716: {
                    717:     struct defaults *d;
                    718:     struct member *m, *binding;
                    719:     struct userspec *us;
                    720:     struct privilege *priv;
                    721:     struct cmndspec *cs;
                    722:     struct sudo_command *c;
                    723: 
                    724:     while ((us = tq_pop(&userspecs)) != NULL) {
                    725:        while ((m = tq_pop(&us->users)) != NULL) {
                    726:            efree(m->name);
                    727:            efree(m);
                    728:        }
                    729:        while ((priv = tq_pop(&us->privileges)) != NULL) {
                    730:            struct member *runasuser = NULL, *runasgroup = NULL;
                    731: #ifdef HAVE_SELINUX
                    732:            char *role = NULL, *type = NULL;
                    733: #endif /* HAVE_SELINUX */
                    734: 
                    735:            while ((m = tq_pop(&priv->hostlist)) != NULL) {
                    736:                efree(m->name);
                    737:                efree(m);
                    738:            }
                    739:            while ((cs = tq_pop(&priv->cmndlist)) != NULL) {
                    740: #ifdef HAVE_SELINUX
                    741:                /* Only free the first instance of a role/type. */
                    742:                if (cs->role != role) {
                    743:                    role = cs->role;
                    744:                    efree(cs->role);
                    745:                }
                    746:                if (cs->type != type) {
                    747:                    type = cs->type;
                    748:                    efree(cs->type);
                    749:                }
                    750: #endif /* HAVE_SELINUX */
                    751:                if (tq_last(&cs->runasuserlist) != runasuser) {
                    752:                    runasuser = tq_last(&cs->runasuserlist);
                    753:                    while ((m = tq_pop(&cs->runasuserlist)) != NULL) {
                    754:                        efree(m->name);
                    755:                        efree(m);
                    756:                    }
                    757:                }
                    758:                if (tq_last(&cs->runasgrouplist) != runasgroup) {
                    759:                    runasgroup = tq_last(&cs->runasgrouplist);
                    760:                    while ((m = tq_pop(&cs->runasgrouplist)) != NULL) {
                    761:                        efree(m->name);
                    762:                        efree(m);
                    763:                    }
                    764:                }
                    765:                if (cs->cmnd->type == COMMAND) {
                    766:                        c = (struct sudo_command *) cs->cmnd->name;
                    767:                        efree(c->cmnd);
                    768:                        efree(c->args);
                    769:                }
                    770:                efree(cs->cmnd->name);
                    771:                efree(cs->cmnd);
                    772:                efree(cs);
                    773:            }
                    774:            efree(priv);
                    775:        }
                    776:        efree(us);
                    777:     }
                    778:     tq_init(&userspecs);
                    779: 
                    780:     binding = NULL;
                    781:     while ((d = tq_pop(&defaults)) != NULL) {
                    782:        if (tq_last(&d->binding) != binding) {
                    783:            binding = tq_last(&d->binding);
                    784:            while ((m = tq_pop(&d->binding)) != NULL) {
                    785:                if (m->type == COMMAND) {
                    786:                        c = (struct sudo_command *) m->name;
                    787:                        efree(c->cmnd);
                    788:                        efree(c->args);
                    789:                }
                    790:                efree(m->name);
                    791:                efree(m);
                    792:            }
                    793:        }
                    794:        efree(d->var);
                    795:        efree(d->val);
                    796:        efree(d);
                    797:     }
                    798:     tq_init(&defaults);
                    799: 
                    800:     init_aliases();
                    801: 
                    802:     init_lexer();
                    803: 
                    804:     efree(sudoers);
                    805:     sudoers = path ? estrdup(path) : NULL;
                    806: 
                    807:     parse_error = FALSE;
                    808:     errorlineno = -1;
                    809:     errorfile = NULL;
                    810:     verbose = !quiet;
                    811: }
                    812: #line 760 "y.tab.c"
                    813: /* allocate initial stack or double stack size, up to YYMAXDEPTH */
                    814: #if defined(__cplusplus) || defined(__STDC__)
                    815: static int yygrowstack(void)
                    816: #else
                    817: static int yygrowstack()
                    818: #endif
                    819: {
                    820:     int newsize, i;
                    821:     short *newss;
                    822:     YYSTYPE *newvs;
                    823: 
                    824:     if ((newsize = yystacksize) == 0)
                    825:         newsize = YYINITSTACKSIZE;
                    826:     else if (newsize >= YYMAXDEPTH)
                    827:         return -1;
                    828:     else if ((newsize *= 2) > YYMAXDEPTH)
                    829:         newsize = YYMAXDEPTH;
                    830:     i = yyssp - yyss;
                    831: #ifdef SIZE_MAX
                    832: #define YY_SIZE_MAX SIZE_MAX
                    833: #else
                    834: #define YY_SIZE_MAX 0x7fffffff
                    835: #endif
                    836:     if (newsize && YY_SIZE_MAX / newsize < sizeof *newss)
                    837:         goto bail;
                    838:     newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :
                    839:       (short *)malloc(newsize * sizeof *newss); /* overflow check above */
                    840:     if (newss == NULL)
                    841:         goto bail;
                    842:     yyss = newss;
                    843:     yyssp = newss + i;
                    844:     if (newsize && YY_SIZE_MAX / newsize < sizeof *newvs)
                    845:         goto bail;
                    846:     newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :
                    847:       (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */
                    848:     if (newvs == NULL)
                    849:         goto bail;
                    850:     yyvs = newvs;
                    851:     yyvsp = newvs + i;
                    852:     yystacksize = newsize;
                    853:     yysslim = yyss + newsize - 1;
                    854:     return 0;
                    855: bail:
                    856:     if (yyss)
                    857:             free(yyss);
                    858:     if (yyvs)
                    859:             free(yyvs);
                    860:     yyss = yyssp = NULL;
                    861:     yyvs = yyvsp = NULL;
                    862:     yystacksize = 0;
                    863:     return -1;
                    864: }
                    865: 
                    866: #define YYABORT goto yyabort
                    867: #define YYREJECT goto yyabort
                    868: #define YYACCEPT goto yyaccept
                    869: #define YYERROR goto yyerrlab
                    870: int
                    871: #if defined(__cplusplus) || defined(__STDC__)
                    872: yyparse(void)
                    873: #else
                    874: yyparse()
                    875: #endif
                    876: {
                    877:     int yym, yyn, yystate;
                    878: #if YYDEBUG
                    879: #if defined(__cplusplus) || defined(__STDC__)
                    880:     const char *yys;
                    881: #else /* !(defined(__cplusplus) || defined(__STDC__)) */
                    882:     char *yys;
                    883: #endif /* !(defined(__cplusplus) || defined(__STDC__)) */
                    884: 
                    885:     if ((yys = getenv("YYDEBUG")))
                    886:     {
                    887:         yyn = *yys;
                    888:         if (yyn >= '0' && yyn <= '9')
                    889:             yydebug = yyn - '0';
                    890:     }
                    891: #endif /* YYDEBUG */
                    892: 
                    893:     yynerrs = 0;
                    894:     yyerrflag = 0;
                    895:     yychar = (-1);
                    896: 
                    897:     if (yyss == NULL && yygrowstack()) goto yyoverflow;
                    898:     yyssp = yyss;
                    899:     yyvsp = yyvs;
                    900:     *yyssp = yystate = 0;
                    901: 
                    902: yyloop:
                    903:     if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
                    904:     if (yychar < 0)
                    905:     {
                    906:         if ((yychar = yylex()) < 0) yychar = 0;
                    907: #if YYDEBUG
                    908:         if (yydebug)
                    909:         {
                    910:             yys = 0;
                    911:             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
                    912:             if (!yys) yys = "illegal-symbol";
                    913:             printf("%sdebug: state %d, reading %d (%s)\n",
                    914:                     YYPREFIX, yystate, yychar, yys);
                    915:         }
                    916: #endif
                    917:     }
                    918:     if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
                    919:             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
                    920:     {
                    921: #if YYDEBUG
                    922:         if (yydebug)
                    923:             printf("%sdebug: state %d, shifting to state %d\n",
                    924:                     YYPREFIX, yystate, yytable[yyn]);
                    925: #endif
                    926:         if (yyssp >= yysslim && yygrowstack())
                    927:         {
                    928:             goto yyoverflow;
                    929:         }
                    930:         *++yyssp = yystate = yytable[yyn];
                    931:         *++yyvsp = yylval;
                    932:         yychar = (-1);
                    933:         if (yyerrflag > 0)  --yyerrflag;
                    934:         goto yyloop;
                    935:     }
                    936:     if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
                    937:             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
                    938:     {
                    939:         yyn = yytable[yyn];
                    940:         goto yyreduce;
                    941:     }
                    942:     if (yyerrflag) goto yyinrecovery;
                    943: #if defined(lint) || defined(__GNUC__)
                    944:     goto yynewerror;
                    945: #endif
                    946: yynewerror:
                    947:     yyerror("syntax error");
                    948: #if defined(lint) || defined(__GNUC__)
                    949:     goto yyerrlab;
                    950: #endif
                    951: yyerrlab:
                    952:     ++yynerrs;
                    953: yyinrecovery:
                    954:     if (yyerrflag < 3)
                    955:     {
                    956:         yyerrflag = 3;
                    957:         for (;;)
                    958:         {
                    959:             if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
                    960:                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
                    961:             {
                    962: #if YYDEBUG
                    963:                 if (yydebug)
                    964:                     printf("%sdebug: state %d, error recovery shifting\
                    965:  to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
                    966: #endif
                    967:                 if (yyssp >= yysslim && yygrowstack())
                    968:                 {
                    969:                     goto yyoverflow;
                    970:                 }
                    971:                 *++yyssp = yystate = yytable[yyn];
                    972:                 *++yyvsp = yylval;
                    973:                 goto yyloop;
                    974:             }
                    975:             else
                    976:             {
                    977: #if YYDEBUG
                    978:                 if (yydebug)
                    979:                     printf("%sdebug: error recovery discarding state %d\n",
                    980:                             YYPREFIX, *yyssp);
                    981: #endif
                    982:                 if (yyssp <= yyss) goto yyabort;
                    983:                 --yyssp;
                    984:                 --yyvsp;
                    985:             }
                    986:         }
                    987:     }
                    988:     else
                    989:     {
                    990:         if (yychar == 0) goto yyabort;
                    991: #if YYDEBUG
                    992:         if (yydebug)
                    993:         {
                    994:             yys = 0;
                    995:             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
                    996:             if (!yys) yys = "illegal-symbol";
                    997:             printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
                    998:                     YYPREFIX, yystate, yychar, yys);
                    999:         }
                   1000: #endif
                   1001:         yychar = (-1);
                   1002:         goto yyloop;
                   1003:     }
                   1004: yyreduce:
                   1005: #if YYDEBUG
                   1006:     if (yydebug)
                   1007:         printf("%sdebug: state %d, reducing by rule %d (%s)\n",
                   1008:                 YYPREFIX, yystate, yyn, yyrule[yyn]);
                   1009: #endif
                   1010:     yym = yylen[yyn];
                   1011:     if (yym)
                   1012:         yyval = yyvsp[1-yym];
                   1013:     else
                   1014:         memset(&yyval, 0, sizeof yyval);
                   1015:     switch (yyn)
                   1016:     {
                   1017: case 1:
                   1018: #line 185 "gram.y"
                   1019: { ; }
                   1020: break;
                   1021: case 5:
                   1022: #line 193 "gram.y"
                   1023: {
                   1024:                            ;
                   1025:                        }
                   1026: break;
                   1027: case 6:
                   1028: #line 196 "gram.y"
                   1029: {
                   1030:                            yyerrok;
                   1031:                        }
                   1032: break;
                   1033: case 7:
                   1034: #line 199 "gram.y"
                   1035: {
                   1036:                            add_userspec(yyvsp[-1].member, yyvsp[0].privilege);
                   1037:                        }
                   1038: break;
                   1039: case 8:
                   1040: #line 202 "gram.y"
                   1041: {
                   1042:                            ;
                   1043:                        }
                   1044: break;
                   1045: case 9:
                   1046: #line 205 "gram.y"
                   1047: {
                   1048:                            ;
                   1049:                        }
                   1050: break;
                   1051: case 10:
                   1052: #line 208 "gram.y"
                   1053: {
                   1054:                            ;
                   1055:                        }
                   1056: break;
                   1057: case 11:
                   1058: #line 211 "gram.y"
                   1059: {
                   1060:                            ;
                   1061:                        }
                   1062: break;
                   1063: case 12:
                   1064: #line 214 "gram.y"
                   1065: {
                   1066:                            add_defaults(DEFAULTS, NULL, yyvsp[0].defaults);
                   1067:                        }
                   1068: break;
                   1069: case 13:
                   1070: #line 217 "gram.y"
                   1071: {
                   1072:                            add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults);
                   1073:                        }
                   1074: break;
                   1075: case 14:
                   1076: #line 220 "gram.y"
                   1077: {
                   1078:                            add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults);
                   1079:                        }
                   1080: break;
                   1081: case 15:
                   1082: #line 223 "gram.y"
                   1083: {
                   1084:                            add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults);
                   1085:                        }
                   1086: break;
                   1087: case 16:
                   1088: #line 226 "gram.y"
                   1089: {
                   1090:                            add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults);
                   1091:                        }
                   1092: break;
                   1093: case 18:
                   1094: #line 232 "gram.y"
                   1095: {
                   1096:                            list_append(yyvsp[-2].defaults, yyvsp[0].defaults);
                   1097:                            yyval.defaults = yyvsp[-2].defaults;
                   1098:                        }
                   1099: break;
                   1100: case 19:
                   1101: #line 238 "gram.y"
                   1102: {
                   1103:                            yyval.defaults = new_default(yyvsp[0].string, NULL, TRUE);
                   1104:                        }
                   1105: break;
                   1106: case 20:
                   1107: #line 241 "gram.y"
                   1108: {
                   1109:                            yyval.defaults = new_default(yyvsp[0].string, NULL, FALSE);
                   1110:                        }
                   1111: break;
                   1112: case 21:
                   1113: #line 244 "gram.y"
                   1114: {
                   1115:                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, TRUE);
                   1116:                        }
                   1117: break;
                   1118: case 22:
                   1119: #line 247 "gram.y"
                   1120: {
                   1121:                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
                   1122:                        }
                   1123: break;
                   1124: case 23:
                   1125: #line 250 "gram.y"
                   1126: {
                   1127:                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
                   1128:                        }
                   1129: break;
                   1130: case 25:
                   1131: #line 256 "gram.y"
                   1132: {
                   1133:                            list_append(yyvsp[-2].privilege, yyvsp[0].privilege);
                   1134:                            yyval.privilege = yyvsp[-2].privilege;
                   1135:                        }
                   1136: break;
                   1137: case 26:
                   1138: #line 262 "gram.y"
                   1139: {
                   1140:                            struct privilege *p = emalloc(sizeof(*p));
                   1141:                            list2tq(&p->hostlist, yyvsp[-2].member);
                   1142:                            list2tq(&p->cmndlist, yyvsp[0].cmndspec);
                   1143:                            p->prev = p;
                   1144:                            p->next = NULL;
                   1145:                            yyval.privilege = p;
                   1146:                        }
                   1147: break;
                   1148: case 27:
                   1149: #line 272 "gram.y"
                   1150: {
                   1151:                            yyval.member = yyvsp[0].member;
                   1152:                            yyval.member->negated = FALSE;
                   1153:                        }
                   1154: break;
                   1155: case 28:
                   1156: #line 276 "gram.y"
                   1157: {
                   1158:                            yyval.member = yyvsp[0].member;
                   1159:                            yyval.member->negated = TRUE;
                   1160:                        }
                   1161: break;
                   1162: case 29:
                   1163: #line 282 "gram.y"
                   1164: {
                   1165:                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                   1166:                        }
                   1167: break;
                   1168: case 30:
                   1169: #line 285 "gram.y"
                   1170: {
                   1171:                            yyval.member = new_member(NULL, ALL);
                   1172:                        }
                   1173: break;
                   1174: case 31:
                   1175: #line 288 "gram.y"
                   1176: {
                   1177:                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                   1178:                        }
                   1179: break;
                   1180: case 32:
                   1181: #line 291 "gram.y"
                   1182: {
                   1183:                            yyval.member = new_member(yyvsp[0].string, NTWKADDR);
                   1184:                        }
                   1185: break;
                   1186: case 33:
                   1187: #line 294 "gram.y"
                   1188: {
                   1189:                            yyval.member = new_member(yyvsp[0].string, WORD);
                   1190:                        }
                   1191: break;
                   1192: case 35:
                   1193: #line 300 "gram.y"
                   1194: {
                   1195:                            list_append(yyvsp[-2].cmndspec, yyvsp[0].cmndspec);
                   1196: #ifdef HAVE_SELINUX
                   1197:                            /* propagate role and type */
                   1198:                            if (yyvsp[0].cmndspec->role == NULL)
                   1199:                                yyvsp[0].cmndspec->role = yyvsp[0].cmndspec->prev->role;
                   1200:                            if (yyvsp[0].cmndspec->type == NULL)
                   1201:                                yyvsp[0].cmndspec->type = yyvsp[0].cmndspec->prev->type;
                   1202: #endif /* HAVE_SELINUX */
                   1203:                            /* propagate tags and runas list */
                   1204:                            if (yyvsp[0].cmndspec->tags.nopasswd == UNSPEC)
                   1205:                                yyvsp[0].cmndspec->tags.nopasswd = yyvsp[0].cmndspec->prev->tags.nopasswd;
                   1206:                            if (yyvsp[0].cmndspec->tags.noexec == UNSPEC)
                   1207:                                yyvsp[0].cmndspec->tags.noexec = yyvsp[0].cmndspec->prev->tags.noexec;
                   1208:                            if (yyvsp[0].cmndspec->tags.setenv == UNSPEC &&
                   1209:                                yyvsp[0].cmndspec->prev->tags.setenv != IMPLIED)
                   1210:                                yyvsp[0].cmndspec->tags.setenv = yyvsp[0].cmndspec->prev->tags.setenv;
                   1211:                            if (yyvsp[0].cmndspec->tags.log_input == UNSPEC)
                   1212:                                yyvsp[0].cmndspec->tags.log_input = yyvsp[0].cmndspec->prev->tags.log_input;
                   1213:                            if (yyvsp[0].cmndspec->tags.log_output == UNSPEC)
                   1214:                                yyvsp[0].cmndspec->tags.log_output = yyvsp[0].cmndspec->prev->tags.log_output;
                   1215:                            if ((tq_empty(&yyvsp[0].cmndspec->runasuserlist) &&
                   1216:                                 tq_empty(&yyvsp[0].cmndspec->runasgrouplist)) &&
                   1217:                                (!tq_empty(&yyvsp[0].cmndspec->prev->runasuserlist) ||
                   1218:                                 !tq_empty(&yyvsp[0].cmndspec->prev->runasgrouplist))) {
                   1219:                                yyvsp[0].cmndspec->runasuserlist = yyvsp[0].cmndspec->prev->runasuserlist;
                   1220:                                yyvsp[0].cmndspec->runasgrouplist = yyvsp[0].cmndspec->prev->runasgrouplist;
                   1221:                            }
                   1222:                            yyval.cmndspec = yyvsp[-2].cmndspec;
                   1223:                        }
                   1224: break;
                   1225: case 36:
                   1226: #line 332 "gram.y"
                   1227: {
                   1228:                            struct cmndspec *cs = emalloc(sizeof(*cs));
                   1229:                            if (yyvsp[-3].runas != NULL) {
                   1230:                                list2tq(&cs->runasuserlist, yyvsp[-3].runas->runasusers);
                   1231:                                list2tq(&cs->runasgrouplist, yyvsp[-3].runas->runasgroups);
                   1232:                                efree(yyvsp[-3].runas);
                   1233:                            } else {
                   1234:                                tq_init(&cs->runasuserlist);
                   1235:                                tq_init(&cs->runasgrouplist);
                   1236:                            }
                   1237: #ifdef HAVE_SELINUX
                   1238:                            cs->role = yyvsp[-2].seinfo.role;
                   1239:                            cs->type = yyvsp[-2].seinfo.type;
                   1240: #endif
                   1241:                            cs->tags = yyvsp[-1].tag;
                   1242:                            cs->cmnd = yyvsp[0].member;
                   1243:                            cs->prev = cs;
                   1244:                            cs->next = NULL;
                   1245:                            /* sudo "ALL" implies the SETENV tag */
                   1246:                            if (cs->cmnd->type == ALL && !cs->cmnd->negated &&
                   1247:                                cs->tags.setenv == UNSPEC)
                   1248:                                cs->tags.setenv = IMPLIED;
                   1249:                            yyval.cmndspec = cs;
                   1250:                        }
                   1251: break;
                   1252: case 37:
                   1253: #line 358 "gram.y"
                   1254: {
                   1255:                            yyval.member = yyvsp[0].member;
                   1256:                            yyval.member->negated = FALSE;
                   1257:                        }
                   1258: break;
                   1259: case 38:
                   1260: #line 362 "gram.y"
                   1261: {
                   1262:                            yyval.member = yyvsp[0].member;
                   1263:                            yyval.member->negated = TRUE;
                   1264:                        }
                   1265: break;
                   1266: case 39:
                   1267: #line 368 "gram.y"
                   1268: {
                   1269:                            yyval.string = yyvsp[0].string;
                   1270:                        }
                   1271: break;
                   1272: case 40:
                   1273: #line 373 "gram.y"
                   1274: {
                   1275:                            yyval.string = yyvsp[0].string;
                   1276:                        }
                   1277: break;
                   1278: case 41:
                   1279: #line 378 "gram.y"
                   1280: {
                   1281:                            yyval.seinfo.role = NULL;
                   1282:                            yyval.seinfo.type = NULL;
                   1283:                        }
                   1284: break;
                   1285: case 42:
                   1286: #line 382 "gram.y"
                   1287: {
                   1288:                            yyval.seinfo.role = yyvsp[0].string;
                   1289:                            yyval.seinfo.type = NULL;
                   1290:                        }
                   1291: break;
                   1292: case 43:
                   1293: #line 386 "gram.y"
                   1294: {
                   1295:                            yyval.seinfo.type = yyvsp[0].string;
                   1296:                            yyval.seinfo.role = NULL;
                   1297:                        }
                   1298: break;
                   1299: case 44:
                   1300: #line 390 "gram.y"
                   1301: {
                   1302:                            yyval.seinfo.role = yyvsp[-1].string;
                   1303:                            yyval.seinfo.type = yyvsp[0].string;
                   1304:                        }
                   1305: break;
                   1306: case 45:
                   1307: #line 394 "gram.y"
                   1308: {
                   1309:                            yyval.seinfo.type = yyvsp[-1].string;
                   1310:                            yyval.seinfo.role = yyvsp[0].string;
                   1311:                        }
                   1312: break;
                   1313: case 46:
                   1314: #line 400 "gram.y"
                   1315: {
                   1316:                            yyval.runas = NULL;
                   1317:                        }
                   1318: break;
                   1319: case 47:
                   1320: #line 403 "gram.y"
                   1321: {
                   1322:                            yyval.runas = yyvsp[-1].runas;
                   1323:                        }
                   1324: break;
                   1325: case 48:
                   1326: #line 408 "gram.y"
                   1327: {
                   1328:                            yyval.runas = emalloc(sizeof(struct runascontainer));
                   1329:                            yyval.runas->runasusers = yyvsp[0].member;
                   1330:                            yyval.runas->runasgroups = NULL;
                   1331:                        }
                   1332: break;
                   1333: case 49:
                   1334: #line 413 "gram.y"
                   1335: {
                   1336:                            yyval.runas = emalloc(sizeof(struct runascontainer));
                   1337:                            yyval.runas->runasusers = yyvsp[-2].member;
                   1338:                            yyval.runas->runasgroups = yyvsp[0].member;
                   1339:                        }
                   1340: break;
                   1341: case 50:
                   1342: #line 418 "gram.y"
                   1343: {
                   1344:                            yyval.runas = emalloc(sizeof(struct runascontainer));
                   1345:                            yyval.runas->runasusers = NULL;
                   1346:                            yyval.runas->runasgroups = yyvsp[0].member;
                   1347:                        }
                   1348: break;
                   1349: case 51:
                   1350: #line 425 "gram.y"
                   1351: {
                   1352:                            yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv =
                   1353:                                yyval.tag.log_input = yyval.tag.log_output = UNSPEC;
                   1354:                        }
                   1355: break;
                   1356: case 52:
                   1357: #line 429 "gram.y"
                   1358: {
                   1359:                            yyval.tag.nopasswd = TRUE;
                   1360:                        }
                   1361: break;
                   1362: case 53:
                   1363: #line 432 "gram.y"
                   1364: {
                   1365:                            yyval.tag.nopasswd = FALSE;
                   1366:                        }
                   1367: break;
                   1368: case 54:
                   1369: #line 435 "gram.y"
                   1370: {
                   1371:                            yyval.tag.noexec = TRUE;
                   1372:                        }
                   1373: break;
                   1374: case 55:
                   1375: #line 438 "gram.y"
                   1376: {
                   1377:                            yyval.tag.noexec = FALSE;
                   1378:                        }
                   1379: break;
                   1380: case 56:
                   1381: #line 441 "gram.y"
                   1382: {
                   1383:                            yyval.tag.setenv = TRUE;
                   1384:                        }
                   1385: break;
                   1386: case 57:
                   1387: #line 444 "gram.y"
                   1388: {
                   1389:                            yyval.tag.setenv = FALSE;
                   1390:                        }
                   1391: break;
                   1392: case 58:
                   1393: #line 447 "gram.y"
                   1394: {
                   1395:                            yyval.tag.log_input = TRUE;
                   1396:                        }
                   1397: break;
                   1398: case 59:
                   1399: #line 450 "gram.y"
                   1400: {
                   1401:                            yyval.tag.log_input = FALSE;
                   1402:                        }
                   1403: break;
                   1404: case 60:
                   1405: #line 453 "gram.y"
                   1406: {
                   1407:                            yyval.tag.log_output = TRUE;
                   1408:                        }
                   1409: break;
                   1410: case 61:
                   1411: #line 456 "gram.y"
                   1412: {
                   1413:                            yyval.tag.log_output = FALSE;
                   1414:                        }
                   1415: break;
                   1416: case 62:
                   1417: #line 461 "gram.y"
                   1418: {
                   1419:                            yyval.member = new_member(NULL, ALL);
                   1420:                        }
                   1421: break;
                   1422: case 63:
                   1423: #line 464 "gram.y"
                   1424: {
                   1425:                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                   1426:                        }
                   1427: break;
                   1428: case 64:
                   1429: #line 467 "gram.y"
                   1430: {
                   1431:                            struct sudo_command *c = emalloc(sizeof(*c));
                   1432:                            c->cmnd = yyvsp[0].command.cmnd;
                   1433:                            c->args = yyvsp[0].command.args;
                   1434:                            yyval.member = new_member((char *)c, COMMAND);
                   1435:                        }
                   1436: break;
                   1437: case 67:
                   1438: #line 479 "gram.y"
                   1439: {
                   1440:                            char *s;
                   1441:                            if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
                   1442:                                yyerror(s);
                   1443:                                YYERROR;
                   1444:                            }
                   1445:                        }
                   1446: break;
                   1447: case 69:
                   1448: #line 489 "gram.y"
                   1449: {
                   1450:                            list_append(yyvsp[-2].member, yyvsp[0].member);
                   1451:                            yyval.member = yyvsp[-2].member;
                   1452:                        }
                   1453: break;
                   1454: case 72:
                   1455: #line 499 "gram.y"
                   1456: {
                   1457:                            char *s;
                   1458:                            if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
                   1459:                                yyerror(s);
                   1460:                                YYERROR;
                   1461:                            }
                   1462:                        }
                   1463: break;
                   1464: case 74:
                   1465: #line 509 "gram.y"
                   1466: {
                   1467:                            list_append(yyvsp[-2].member, yyvsp[0].member);
                   1468:                            yyval.member = yyvsp[-2].member;
                   1469:                        }
                   1470: break;
                   1471: case 77:
                   1472: #line 519 "gram.y"
                   1473: {
                   1474:                            char *s;
                   1475:                            if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
                   1476:                                yyerror(s);
                   1477:                                YYERROR;
                   1478:                            }
                   1479:                        }
                   1480: break;
                   1481: case 80:
                   1482: #line 532 "gram.y"
                   1483: {
                   1484:                            char *s;
                   1485:                            if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
                   1486:                                yyerror(s);
                   1487:                                YYERROR;
                   1488:                            }
                   1489:                        }
                   1490: break;
                   1491: case 82:
                   1492: #line 542 "gram.y"
                   1493: {
                   1494:                            list_append(yyvsp[-2].member, yyvsp[0].member);
                   1495:                            yyval.member = yyvsp[-2].member;
                   1496:                        }
                   1497: break;
                   1498: case 83:
                   1499: #line 548 "gram.y"
                   1500: {
                   1501:                            yyval.member = yyvsp[0].member;
                   1502:                            yyval.member->negated = FALSE;
                   1503:                        }
                   1504: break;
                   1505: case 84:
                   1506: #line 552 "gram.y"
                   1507: {
                   1508:                            yyval.member = yyvsp[0].member;
                   1509:                            yyval.member->negated = TRUE;
                   1510:                        }
                   1511: break;
                   1512: case 85:
                   1513: #line 558 "gram.y"
                   1514: {
                   1515:                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                   1516:                        }
                   1517: break;
                   1518: case 86:
                   1519: #line 561 "gram.y"
                   1520: {
                   1521:                            yyval.member = new_member(NULL, ALL);
                   1522:                        }
                   1523: break;
                   1524: case 87:
                   1525: #line 564 "gram.y"
                   1526: {
                   1527:                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                   1528:                        }
                   1529: break;
                   1530: case 88:
                   1531: #line 567 "gram.y"
                   1532: {
                   1533:                            yyval.member = new_member(yyvsp[0].string, USERGROUP);
                   1534:                        }
                   1535: break;
                   1536: case 89:
                   1537: #line 570 "gram.y"
                   1538: {
                   1539:                            yyval.member = new_member(yyvsp[0].string, WORD);
                   1540:                        }
                   1541: break;
                   1542: case 91:
                   1543: #line 576 "gram.y"
                   1544: {
                   1545:                            list_append(yyvsp[-2].member, yyvsp[0].member);
                   1546:                            yyval.member = yyvsp[-2].member;
                   1547:                        }
                   1548: break;
                   1549: case 92:
                   1550: #line 582 "gram.y"
                   1551: {
                   1552:                            yyval.member = yyvsp[0].member;
                   1553:                            yyval.member->negated = FALSE;
                   1554:                        }
                   1555: break;
                   1556: case 93:
                   1557: #line 586 "gram.y"
                   1558: {
                   1559:                            yyval.member = yyvsp[0].member;
                   1560:                            yyval.member->negated = TRUE;
                   1561:                        }
                   1562: break;
                   1563: case 94:
                   1564: #line 592 "gram.y"
                   1565: {
                   1566:                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                   1567:                        }
                   1568: break;
                   1569: case 95:
                   1570: #line 595 "gram.y"
                   1571: {
                   1572:                            yyval.member = new_member(NULL, ALL);
                   1573:                        }
                   1574: break;
                   1575: case 96:
                   1576: #line 598 "gram.y"
                   1577: {
                   1578:                            yyval.member = new_member(yyvsp[0].string, WORD);
                   1579:                        }
                   1580: break;
                   1581: #line 1529 "y.tab.c"
                   1582:     }
                   1583:     yyssp -= yym;
                   1584:     yystate = *yyssp;
                   1585:     yyvsp -= yym;
                   1586:     yym = yylhs[yyn];
                   1587:     if (yystate == 0 && yym == 0)
                   1588:     {
                   1589: #if YYDEBUG
                   1590:         if (yydebug)
                   1591:             printf("%sdebug: after reduction, shifting from state 0 to\
                   1592:  state %d\n", YYPREFIX, YYFINAL);
                   1593: #endif
                   1594:         yystate = YYFINAL;
                   1595:         *++yyssp = YYFINAL;
                   1596:         *++yyvsp = yyval;
                   1597:         if (yychar < 0)
                   1598:         {
                   1599:             if ((yychar = yylex()) < 0) yychar = 0;
                   1600: #if YYDEBUG
                   1601:             if (yydebug)
                   1602:             {
                   1603:                 yys = 0;
                   1604:                 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
                   1605:                 if (!yys) yys = "illegal-symbol";
                   1606:                 printf("%sdebug: state %d, reading %d (%s)\n",
                   1607:                         YYPREFIX, YYFINAL, yychar, yys);
                   1608:             }
                   1609: #endif
                   1610:         }
                   1611:         if (yychar == 0) goto yyaccept;
                   1612:         goto yyloop;
                   1613:     }
                   1614:     if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
                   1615:             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
                   1616:         yystate = yytable[yyn];
                   1617:     else
                   1618:         yystate = yydgoto[yym];
                   1619: #if YYDEBUG
                   1620:     if (yydebug)
                   1621:         printf("%sdebug: after reduction, shifting from state %d \
                   1622: to state %d\n", YYPREFIX, *yyssp, yystate);
                   1623: #endif
                   1624:     if (yyssp >= yysslim && yygrowstack())
                   1625:     {
                   1626:         goto yyoverflow;
                   1627:     }
                   1628:     *++yyssp = yystate;
                   1629:     *++yyvsp = yyval;
                   1630:     goto yyloop;
                   1631: yyoverflow:
                   1632:     yyerror("yacc stack overflow");
                   1633: yyabort:
                   1634:     if (yyss)
                   1635:             free(yyss);
                   1636:     if (yyvs)
                   1637:             free(yyvs);
                   1638:     yyss = yyssp = NULL;
                   1639:     yyvs = yyvsp = NULL;
                   1640:     yystacksize = 0;
                   1641:     return (1);
                   1642: yyaccept:
                   1643:     if (yyss)
                   1644:             free(yyss);
                   1645:     if (yyvs)
                   1646:             free(yyvs);
                   1647:     yyss = yyssp = NULL;
                   1648:     yyvs = yyvsp = NULL;
                   1649:     yystacksize = 0;
                   1650:     return (0);
                   1651: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>