File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / plugins / sudoers / gram.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:23:02 2012 UTC (12 years, 4 months ago) by misho
Branches: sudo, MAIN
CVS tags: v1_8_3p2, HEAD
sudo

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

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