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