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