man pages get built in the build- directories
[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.34 2008/11/09 14:15:36 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     efree(sudoers);
802     sudoers = path ? estrdup(path) : NULL;
803
804     parse_error = FALSE;
805     errorlineno = -1;
806     sudolineno = 1;
807     verbose = !quiet;
808 }
809 #line 758 "y.tab.c"
810 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
811 #if defined(__cplusplus) || defined(__STDC__)
812 static int yygrowstack(void)
813 #else
814 static int yygrowstack()
815 #endif
816 {
817     int newsize, i;
818     short *newss;
819     YYSTYPE *newvs;
820
821     if ((newsize = yystacksize) == 0)
822         newsize = YYINITSTACKSIZE;
823     else if (newsize >= YYMAXDEPTH)
824         return -1;
825     else if ((newsize *= 2) > YYMAXDEPTH)
826         newsize = YYMAXDEPTH;
827     i = yyssp - yyss;
828 #ifdef SIZE_MAX
829 #define YY_SIZE_MAX SIZE_MAX
830 #else
831 #define YY_SIZE_MAX 0x7fffffff
832 #endif
833     if (newsize && YY_SIZE_MAX / newsize < sizeof *newss)
834         goto bail;
835     newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :
836       (short *)malloc(newsize * sizeof *newss); /* overflow check above */
837     if (newss == NULL)
838         goto bail;
839     yyss = newss;
840     yyssp = newss + i;
841     if (newsize && YY_SIZE_MAX / newsize < sizeof *newvs)
842         goto bail;
843     newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :
844       (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */
845     if (newvs == NULL)
846         goto bail;
847     yyvs = newvs;
848     yyvsp = newvs + i;
849     yystacksize = newsize;
850     yysslim = yyss + newsize - 1;
851     return 0;
852 bail:
853     if (yyss)
854             free(yyss);
855     if (yyvs)
856             free(yyvs);
857     yyss = yyssp = NULL;
858     yyvs = yyvsp = NULL;
859     yystacksize = 0;
860     return -1;
861 }
862
863 #define YYABORT goto yyabort
864 #define YYREJECT goto yyabort
865 #define YYACCEPT goto yyaccept
866 #define YYERROR goto yyerrlab
867 int
868 #if defined(__cplusplus) || defined(__STDC__)
869 yyparse(void)
870 #else
871 yyparse()
872 #endif
873 {
874     int yym, yyn, yystate;
875 #if YYDEBUG
876 #if defined(__cplusplus) || defined(__STDC__)
877     const char *yys;
878 #else /* !(defined(__cplusplus) || defined(__STDC__)) */
879     char *yys;
880 #endif /* !(defined(__cplusplus) || defined(__STDC__)) */
881
882     if ((yys = getenv("YYDEBUG")))
883     {
884         yyn = *yys;
885         if (yyn >= '0' && yyn <= '9')
886             yydebug = yyn - '0';
887     }
888 #endif /* YYDEBUG */
889
890     yynerrs = 0;
891     yyerrflag = 0;
892     yychar = (-1);
893
894     if (yyss == NULL && yygrowstack()) goto yyoverflow;
895     yyssp = yyss;
896     yyvsp = yyvs;
897     *yyssp = yystate = 0;
898
899 yyloop:
900     if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
901     if (yychar < 0)
902     {
903         if ((yychar = yylex()) < 0) yychar = 0;
904 #if YYDEBUG
905         if (yydebug)
906         {
907             yys = 0;
908             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
909             if (!yys) yys = "illegal-symbol";
910             printf("%sdebug: state %d, reading %d (%s)\n",
911                     YYPREFIX, yystate, yychar, yys);
912         }
913 #endif
914     }
915     if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
916             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
917     {
918 #if YYDEBUG
919         if (yydebug)
920             printf("%sdebug: state %d, shifting to state %d\n",
921                     YYPREFIX, yystate, yytable[yyn]);
922 #endif
923         if (yyssp >= yysslim && yygrowstack())
924         {
925             goto yyoverflow;
926         }
927         *++yyssp = yystate = yytable[yyn];
928         *++yyvsp = yylval;
929         yychar = (-1);
930         if (yyerrflag > 0)  --yyerrflag;
931         goto yyloop;
932     }
933     if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
934             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
935     {
936         yyn = yytable[yyn];
937         goto yyreduce;
938     }
939     if (yyerrflag) goto yyinrecovery;
940 #if defined(lint) || defined(__GNUC__)
941     goto yynewerror;
942 #endif
943 yynewerror:
944     yyerror("syntax error");
945 #if defined(lint) || defined(__GNUC__)
946     goto yyerrlab;
947 #endif
948 yyerrlab:
949     ++yynerrs;
950 yyinrecovery:
951     if (yyerrflag < 3)
952     {
953         yyerrflag = 3;
954         for (;;)
955         {
956             if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
957                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
958             {
959 #if YYDEBUG
960                 if (yydebug)
961                     printf("%sdebug: state %d, error recovery shifting\
962  to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
963 #endif
964                 if (yyssp >= yysslim && yygrowstack())
965                 {
966                     goto yyoverflow;
967                 }
968                 *++yyssp = yystate = yytable[yyn];
969                 *++yyvsp = yylval;
970                 goto yyloop;
971             }
972             else
973             {
974 #if YYDEBUG
975                 if (yydebug)
976                     printf("%sdebug: error recovery discarding state %d\n",
977                             YYPREFIX, *yyssp);
978 #endif
979                 if (yyssp <= yyss) goto yyabort;
980                 --yyssp;
981                 --yyvsp;
982             }
983         }
984     }
985     else
986     {
987         if (yychar == 0) goto yyabort;
988 #if YYDEBUG
989         if (yydebug)
990         {
991             yys = 0;
992             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
993             if (!yys) yys = "illegal-symbol";
994             printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
995                     YYPREFIX, yystate, yychar, yys);
996         }
997 #endif
998         yychar = (-1);
999         goto yyloop;
1000     }
1001 yyreduce:
1002 #if YYDEBUG
1003     if (yydebug)
1004         printf("%sdebug: state %d, reducing by rule %d (%s)\n",
1005                 YYPREFIX, yystate, yyn, yyrule[yyn]);
1006 #endif
1007     yym = yylen[yyn];
1008     if (yym)
1009         yyval = yyvsp[1-yym];
1010     else
1011         memset(&yyval, 0, sizeof yyval);
1012     switch (yyn)
1013     {
1014 case 1:
1015 #line 188 "gram.y"
1016 { ; }
1017 break;
1018 case 5:
1019 #line 196 "gram.y"
1020 {
1021                             ;
1022                         }
1023 break;
1024 case 6:
1025 #line 199 "gram.y"
1026 {
1027                             yyerrok;
1028                         }
1029 break;
1030 case 7:
1031 #line 202 "gram.y"
1032 {
1033                             add_userspec(yyvsp[-1].member, yyvsp[0].privilege);
1034                         }
1035 break;
1036 case 8:
1037 #line 205 "gram.y"
1038 {
1039                             ;
1040                         }
1041 break;
1042 case 9:
1043 #line 208 "gram.y"
1044 {
1045                             ;
1046                         }
1047 break;
1048 case 10:
1049 #line 211 "gram.y"
1050 {
1051                             ;
1052                         }
1053 break;
1054 case 11:
1055 #line 214 "gram.y"
1056 {
1057                             ;
1058                         }
1059 break;
1060 case 12:
1061 #line 217 "gram.y"
1062 {
1063                             add_defaults(DEFAULTS, NULL, yyvsp[0].defaults);
1064                         }
1065 break;
1066 case 13:
1067 #line 220 "gram.y"
1068 {
1069                             add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults);
1070                         }
1071 break;
1072 case 14:
1073 #line 223 "gram.y"
1074 {
1075                             add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults);
1076                         }
1077 break;
1078 case 15:
1079 #line 226 "gram.y"
1080 {
1081                             add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults);
1082                         }
1083 break;
1084 case 16:
1085 #line 229 "gram.y"
1086 {
1087                             add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults);
1088                         }
1089 break;
1090 case 18:
1091 #line 235 "gram.y"
1092 {
1093                             list_append(yyvsp[-2].defaults, yyvsp[0].defaults);
1094                             yyval.defaults = yyvsp[-2].defaults;
1095                         }
1096 break;
1097 case 19:
1098 #line 241 "gram.y"
1099 {
1100                             yyval.defaults = new_default(yyvsp[0].string, NULL, TRUE);
1101                         }
1102 break;
1103 case 20:
1104 #line 244 "gram.y"
1105 {
1106                             yyval.defaults = new_default(yyvsp[0].string, NULL, FALSE);
1107                         }
1108 break;
1109 case 21:
1110 #line 247 "gram.y"
1111 {
1112                             yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, TRUE);
1113                         }
1114 break;
1115 case 22:
1116 #line 250 "gram.y"
1117 {
1118                             yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
1119                         }
1120 break;
1121 case 23:
1122 #line 253 "gram.y"
1123 {
1124                             yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
1125                         }
1126 break;
1127 case 25:
1128 #line 259 "gram.y"
1129 {
1130                             list_append(yyvsp[-2].privilege, yyvsp[0].privilege);
1131                             yyval.privilege = yyvsp[-2].privilege;
1132                         }
1133 break;
1134 case 26:
1135 #line 265 "gram.y"
1136 {
1137                             struct privilege *p = emalloc(sizeof(*p));
1138                             list2tq(&p->hostlist, yyvsp[-2].member);
1139                             list2tq(&p->cmndlist, yyvsp[0].cmndspec);
1140                             p->prev = p;
1141                             p->next = NULL;
1142                             yyval.privilege = p;
1143                         }
1144 break;
1145 case 27:
1146 #line 275 "gram.y"
1147 {
1148                             yyval.member = yyvsp[0].member;
1149                             yyval.member->negated = FALSE;
1150                         }
1151 break;
1152 case 28:
1153 #line 279 "gram.y"
1154 {
1155                             yyval.member = yyvsp[0].member;
1156                             yyval.member->negated = TRUE;
1157                         }
1158 break;
1159 case 29:
1160 #line 285 "gram.y"
1161 {
1162                             yyval.member = new_member(yyvsp[0].string, ALIAS);
1163                         }
1164 break;
1165 case 30:
1166 #line 288 "gram.y"
1167 {
1168                             yyval.member = new_member(NULL, ALL);
1169                         }
1170 break;
1171 case 31:
1172 #line 291 "gram.y"
1173 {
1174                             yyval.member = new_member(yyvsp[0].string, NETGROUP);
1175                         }
1176 break;
1177 case 32:
1178 #line 294 "gram.y"
1179 {
1180                             yyval.member = new_member(yyvsp[0].string, NTWKADDR);
1181                         }
1182 break;
1183 case 33:
1184 #line 297 "gram.y"
1185 {
1186                             yyval.member = new_member(yyvsp[0].string, WORD);
1187                         }
1188 break;
1189 case 35:
1190 #line 303 "gram.y"
1191 {
1192                             list_append(yyvsp[-2].cmndspec, yyvsp[0].cmndspec);
1193 #ifdef HAVE_SELINUX
1194                             /* propagate role and type */
1195                             if (yyvsp[0].cmndspec->role == NULL)
1196                                 yyvsp[0].cmndspec->role = yyvsp[0].cmndspec->prev->role;
1197                             if (yyvsp[0].cmndspec->type == NULL)
1198                                 yyvsp[0].cmndspec->type = yyvsp[0].cmndspec->prev->type;
1199 #endif /* HAVE_SELINUX */
1200                             /* propagate tags and runas list */
1201                             if (yyvsp[0].cmndspec->tags.nopasswd == UNSPEC)
1202                                 yyvsp[0].cmndspec->tags.nopasswd = yyvsp[0].cmndspec->prev->tags.nopasswd;
1203                             if (yyvsp[0].cmndspec->tags.noexec == UNSPEC)
1204                                 yyvsp[0].cmndspec->tags.noexec = yyvsp[0].cmndspec->prev->tags.noexec;
1205                             if (yyvsp[0].cmndspec->tags.setenv == UNSPEC &&
1206                                 yyvsp[0].cmndspec->prev->tags.setenv != IMPLIED)
1207                                 yyvsp[0].cmndspec->tags.setenv = yyvsp[0].cmndspec->prev->tags.setenv;
1208                             if ((tq_empty(&yyvsp[0].cmndspec->runasuserlist) &&
1209                                  tq_empty(&yyvsp[0].cmndspec->runasgrouplist)) &&
1210                                 (!tq_empty(&yyvsp[0].cmndspec->prev->runasuserlist) ||
1211                                  !tq_empty(&yyvsp[0].cmndspec->prev->runasgrouplist))) {
1212                                 yyvsp[0].cmndspec->runasuserlist = yyvsp[0].cmndspec->prev->runasuserlist;
1213                                 yyvsp[0].cmndspec->runasgrouplist = yyvsp[0].cmndspec->prev->runasgrouplist;
1214                             }
1215                             yyval.cmndspec = yyvsp[-2].cmndspec;
1216                         }
1217 break;
1218 case 36:
1219 #line 331 "gram.y"
1220 {
1221                             struct cmndspec *cs = emalloc(sizeof(*cs));
1222                             if (yyvsp[-3].runas != NULL) {
1223                                 list2tq(&cs->runasuserlist, yyvsp[-3].runas->runasusers);
1224                                 list2tq(&cs->runasgrouplist, yyvsp[-3].runas->runasgroups);
1225                                 efree(yyvsp[-3].runas);
1226                             } else {
1227                                 tq_init(&cs->runasuserlist);
1228                                 tq_init(&cs->runasgrouplist);
1229                             }
1230 #ifdef HAVE_SELINUX
1231                             cs->role = yyvsp[-2].seinfo.role;
1232                             cs->type = yyvsp[-2].seinfo.type;
1233 #endif
1234                             cs->tags = yyvsp[-1].tag;
1235                             cs->cmnd = yyvsp[0].member;
1236                             cs->prev = cs;
1237                             cs->next = NULL;
1238                             /* sudo "ALL" implies the SETENV tag */
1239                             if (cs->cmnd->type == ALL && !cs->cmnd->negated &&
1240                                 cs->tags.setenv == UNSPEC)
1241                                 cs->tags.setenv = IMPLIED;
1242                             yyval.cmndspec = cs;
1243                         }
1244 break;
1245 case 37:
1246 #line 357 "gram.y"
1247 {
1248                             yyval.member = yyvsp[0].member;
1249                             yyval.member->negated = FALSE;
1250                         }
1251 break;
1252 case 38:
1253 #line 361 "gram.y"
1254 {
1255                             yyval.member = yyvsp[0].member;
1256                             yyval.member->negated = TRUE;
1257                         }
1258 break;
1259 case 39:
1260 #line 367 "gram.y"
1261 {
1262                             yyval.string = yyvsp[0].string;
1263                         }
1264 break;
1265 case 40:
1266 #line 372 "gram.y"
1267 {
1268                             yyval.string = yyvsp[0].string;
1269                         }
1270 break;
1271 case 41:
1272 #line 377 "gram.y"
1273 {
1274                             yyval.seinfo.role = NULL;
1275                             yyval.seinfo.type = NULL;
1276                         }
1277 break;
1278 case 42:
1279 #line 381 "gram.y"
1280 {
1281                             yyval.seinfo.role = yyvsp[0].string;
1282                             yyval.seinfo.type = NULL;
1283                         }
1284 break;
1285 case 43:
1286 #line 385 "gram.y"
1287 {
1288                             yyval.seinfo.type = yyvsp[0].string;
1289                             yyval.seinfo.role = NULL;
1290                         }
1291 break;
1292 case 44:
1293 #line 389 "gram.y"
1294 {
1295                             yyval.seinfo.role = yyvsp[-1].string;
1296                             yyval.seinfo.type = yyvsp[0].string;
1297                         }
1298 break;
1299 case 45:
1300 #line 393 "gram.y"
1301 {
1302                             yyval.seinfo.type = yyvsp[-1].string;
1303                             yyval.seinfo.role = yyvsp[0].string;
1304                         }
1305 break;
1306 case 46:
1307 #line 399 "gram.y"
1308 {
1309                             yyval.runas = NULL;
1310                         }
1311 break;
1312 case 47:
1313 #line 402 "gram.y"
1314 {
1315                             yyval.runas = yyvsp[-1].runas;
1316                         }
1317 break;
1318 case 48:
1319 #line 407 "gram.y"
1320 {
1321                             yyval.runas = emalloc(sizeof(struct runascontainer));
1322                             yyval.runas->runasusers = yyvsp[0].member;
1323                             yyval.runas->runasgroups = NULL;
1324                         }
1325 break;
1326 case 49:
1327 #line 412 "gram.y"
1328 {
1329                             yyval.runas = emalloc(sizeof(struct runascontainer));
1330                             yyval.runas->runasusers = yyvsp[-2].member;
1331                             yyval.runas->runasgroups = yyvsp[0].member;
1332                         }
1333 break;
1334 case 50:
1335 #line 417 "gram.y"
1336 {
1337                             yyval.runas = emalloc(sizeof(struct runascontainer));
1338                             yyval.runas->runasusers = NULL;
1339                             yyval.runas->runasgroups = yyvsp[0].member;
1340                         }
1341 break;
1342 case 51:
1343 #line 424 "gram.y"
1344 {
1345                             yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv = UNSPEC;
1346                         }
1347 break;
1348 case 52:
1349 #line 427 "gram.y"
1350 {
1351                             yyval.tag.nopasswd = TRUE;
1352                         }
1353 break;
1354 case 53:
1355 #line 430 "gram.y"
1356 {
1357                             yyval.tag.nopasswd = FALSE;
1358                         }
1359 break;
1360 case 54:
1361 #line 433 "gram.y"
1362 {
1363                             yyval.tag.noexec = TRUE;
1364                         }
1365 break;
1366 case 55:
1367 #line 436 "gram.y"
1368 {
1369                             yyval.tag.noexec = FALSE;
1370                         }
1371 break;
1372 case 56:
1373 #line 439 "gram.y"
1374 {
1375                             yyval.tag.setenv = TRUE;
1376                         }
1377 break;
1378 case 57:
1379 #line 442 "gram.y"
1380 {
1381                             yyval.tag.setenv = FALSE;
1382                         }
1383 break;
1384 case 58:
1385 #line 447 "gram.y"
1386 {
1387                             yyval.member = new_member(NULL, ALL);
1388                         }
1389 break;
1390 case 59:
1391 #line 450 "gram.y"
1392 {
1393                             yyval.member = new_member(yyvsp[0].string, ALIAS);
1394                         }
1395 break;
1396 case 60:
1397 #line 453 "gram.y"
1398 {
1399                             struct sudo_command *c = emalloc(sizeof(*c));
1400                             c->cmnd = yyvsp[0].command.cmnd;
1401                             c->args = yyvsp[0].command.args;
1402                             yyval.member = new_member((char *)c, COMMAND);
1403                         }
1404 break;
1405 case 63:
1406 #line 465 "gram.y"
1407 {
1408                             char *s;
1409                             if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
1410                                 yyerror(s);
1411                                 YYERROR;
1412                             }
1413                         }
1414 break;
1415 case 65:
1416 #line 475 "gram.y"
1417 {
1418                             list_append(yyvsp[-2].member, yyvsp[0].member);
1419                             yyval.member = yyvsp[-2].member;
1420                         }
1421 break;
1422 case 68:
1423 #line 485 "gram.y"
1424 {
1425                             char *s;
1426                             if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
1427                                 yyerror(s);
1428                                 YYERROR;
1429                             }
1430                         }
1431 break;
1432 case 70:
1433 #line 495 "gram.y"
1434 {
1435                             list_append(yyvsp[-2].member, yyvsp[0].member);
1436                             yyval.member = yyvsp[-2].member;
1437                         }
1438 break;
1439 case 73:
1440 #line 505 "gram.y"
1441 {
1442                             char *s;
1443                             if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
1444                                 yyerror(s);
1445                                 YYERROR;
1446                             }
1447                         }
1448 break;
1449 case 76:
1450 #line 518 "gram.y"
1451 {
1452                             char *s;
1453                             if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
1454                                 yyerror(s);
1455                                 YYERROR;
1456                             }
1457                         }
1458 break;
1459 case 78:
1460 #line 528 "gram.y"
1461 {
1462                             list_append(yyvsp[-2].member, yyvsp[0].member);
1463                             yyval.member = yyvsp[-2].member;
1464                         }
1465 break;
1466 case 79:
1467 #line 534 "gram.y"
1468 {
1469                             yyval.member = yyvsp[0].member;
1470                             yyval.member->negated = FALSE;
1471                         }
1472 break;
1473 case 80:
1474 #line 538 "gram.y"
1475 {
1476                             yyval.member = yyvsp[0].member;
1477                             yyval.member->negated = TRUE;
1478                         }
1479 break;
1480 case 81:
1481 #line 544 "gram.y"
1482 {
1483                             yyval.member = new_member(yyvsp[0].string, ALIAS);
1484                         }
1485 break;
1486 case 82:
1487 #line 547 "gram.y"
1488 {
1489                             yyval.member = new_member(NULL, ALL);
1490                         }
1491 break;
1492 case 83:
1493 #line 550 "gram.y"
1494 {
1495                             yyval.member = new_member(yyvsp[0].string, NETGROUP);
1496                         }
1497 break;
1498 case 84:
1499 #line 553 "gram.y"
1500 {
1501                             yyval.member = new_member(yyvsp[0].string, USERGROUP);
1502                         }
1503 break;
1504 case 85:
1505 #line 556 "gram.y"
1506 {
1507                             yyval.member = new_member(yyvsp[0].string, WORD);
1508                         }
1509 break;
1510 case 87:
1511 #line 562 "gram.y"
1512 {
1513                             list_append(yyvsp[-2].member, yyvsp[0].member);
1514                             yyval.member = yyvsp[-2].member;
1515                         }
1516 break;
1517 case 88:
1518 #line 568 "gram.y"
1519 {
1520                             yyval.member = yyvsp[0].member;
1521                             yyval.member->negated = FALSE;
1522                         }
1523 break;
1524 case 89:
1525 #line 572 "gram.y"
1526 {
1527                             yyval.member = yyvsp[0].member;
1528                             yyval.member->negated = TRUE;
1529                         }
1530 break;
1531 case 90:
1532 #line 578 "gram.y"
1533 {
1534                             yyval.member = new_member(yyvsp[0].string, ALIAS);
1535                         }
1536 break;
1537 case 91:
1538 #line 581 "gram.y"
1539 {
1540                             yyval.member = new_member(NULL, ALL);
1541                         }
1542 break;
1543 case 92:
1544 #line 584 "gram.y"
1545 {
1546                             yyval.member = new_member(yyvsp[0].string, WORD);
1547                         }
1548 break;
1549 #line 1498 "y.tab.c"
1550     }
1551     yyssp -= yym;
1552     yystate = *yyssp;
1553     yyvsp -= yym;
1554     yym = yylhs[yyn];
1555     if (yystate == 0 && yym == 0)
1556     {
1557 #if YYDEBUG
1558         if (yydebug)
1559             printf("%sdebug: after reduction, shifting from state 0 to\
1560  state %d\n", YYPREFIX, YYFINAL);
1561 #endif
1562         yystate = YYFINAL;
1563         *++yyssp = YYFINAL;
1564         *++yyvsp = yyval;
1565         if (yychar < 0)
1566         {
1567             if ((yychar = yylex()) < 0) yychar = 0;
1568 #if YYDEBUG
1569             if (yydebug)
1570             {
1571                 yys = 0;
1572                 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
1573                 if (!yys) yys = "illegal-symbol";
1574                 printf("%sdebug: state %d, reading %d (%s)\n",
1575                         YYPREFIX, YYFINAL, yychar, yys);
1576             }
1577 #endif
1578         }
1579         if (yychar == 0) goto yyaccept;
1580         goto yyloop;
1581     }
1582     if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
1583             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
1584         yystate = yytable[yyn];
1585     else
1586         yystate = yydgoto[yym];
1587 #if YYDEBUG
1588     if (yydebug)
1589         printf("%sdebug: after reduction, shifting from state %d \
1590 to state %d\n", YYPREFIX, *yyssp, yystate);
1591 #endif
1592     if (yyssp >= yysslim && yygrowstack())
1593     {
1594         goto yyoverflow;
1595     }
1596     *++yyssp = yystate;
1597     *++yyvsp = yyval;
1598     goto yyloop;
1599 yyoverflow:
1600     yyerror("yacc stack overflow");
1601 yyabort:
1602     if (yyss)
1603             free(yyss);
1604     if (yyvs)
1605             free(yyvs);
1606     yyss = yyssp = NULL;
1607     yyvs = yyvsp = NULL;
1608     yystacksize = 0;
1609     return (1);
1610 yyaccept:
1611     if (yyss)
1612             free(yyss);
1613     if (yyvs)
1614             free(yyvs);
1615     yyss = yyssp = NULL;
1616     yyvs = yyvsp = NULL;
1617     yystacksize = 0;
1618     return (0);
1619 }