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