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