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

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

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