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