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

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

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