Return to gram.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / plugins / sudoers |
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: }