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