Annotation of embedaddon/sudo/plugins/sudoers/gram.c, revision 1.1.1.4
1.1 misho 1: #include <config.h>
2: #include <stdlib.h>
3: #include <string.h>
4: #define YYBYACC 1
5: #define YYMAJOR 1
6: #define YYMINOR 9
7: #define YYLEX yylex()
8: #define YYEMPTY -1
9: #define yyclearin (yychar=(YYEMPTY))
10: #define yyerrok (yyerrflag=0)
11: #define YYRECOVERING() (yyerrflag!=0)
1.1.1.4 ! misho 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"
1.1 misho 39: #line 2 "gram.y"
40: /*
1.1.1.4 ! misho 41: * Copyright (c) 1996, 1998-2005, 2007-2013
1.1 misho 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 */
1.1.1.3 misho 84: #ifdef HAVE_INTTYPES_H
85: # include <inttypes.h>
86: #endif
1.1 misho 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;
1.1.1.2 misho 113: extern int last_token;
1.1 misho 114: extern char *sudoers;
1.1.1.2 misho 115: bool sudoers_warnings = true;
116: bool parse_error = false;
1.1 misho 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);
1.1.1.4 ! misho 130: static struct sudo_digest *new_digest(int, const char *);
! 131: #line 95 "gram.y"
1.1 misho 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;
1.1.1.4 ! misho 140: struct sudo_digest *digest;
1.1 misho 141: struct sudo_command command;
142: struct cmndtag tag;
143: struct selinux_info seinfo;
1.1.1.3 misho 144: struct solaris_privs_info privinfo;
1.1 misho 145: char *string;
146: int tok;
147: } YYSTYPE;
148: #endif /* YYSTYPE_DEFINED */
1.1.1.3 misho 149: #line 149 "gram.c"
1.1 misho 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
1.1.1.4 ! misho 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
1.1 misho 189: #define YYERRCODE 256
190: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 191: const short sudoerslhs[] =
1.1 misho 192: #else
1.1.1.4 ! misho 193: short sudoerslhs[] =
1.1 misho 194: #endif
195: { -1,
1.1.1.4 ! misho 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,
1.1 misho 208: };
209: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 210: const short sudoerslen[] =
1.1 misho 211: #else
1.1.1.4 ! misho 212: short sudoerslen[] =
1.1 misho 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,
1.1.1.4 ! misho 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,
1.1 misho 227: };
228: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 229: const short sudoersdefred[] =
1.1 misho 230: #else
1.1.1.4 ! misho 231: short sudoersdefred[] =
1.1 misho 232: #endif
233: { 0,
1.1.1.4 ! misho 234: 0, 100, 102, 103, 104, 0, 0, 0, 0, 0,
! 235: 101, 5, 0, 0, 0, 0, 0, 0, 96, 98,
1.1 misho 236: 0, 0, 3, 6, 0, 0, 17, 0, 29, 32,
1.1.1.4 ! misho 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,
1.1 misho 252: };
253: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 254: const short sudoersdgoto[] =
1.1 misho 255: #else
1.1.1.4 ! misho 256: short sudoersdgoto[] =
1.1 misho 257: #endif
258: { 18,
1.1.1.4 ! misho 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,
1.1 misho 263: };
264: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 265: const short sudoerssindex[] =
1.1 misho 266: #else
1.1.1.4 ! misho 267: short sudoerssindex[] =
1.1 misho 268: #endif
1.1.1.4 ! misho 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,};
1.1 misho 288: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 289: const short sudoersrindex[] =
1.1 misho 290: #else
1.1.1.4 ! misho 291: short sudoersrindex[] =
1.1 misho 292: #endif
1.1.1.4 ! misho 293: { 106,
! 294: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1.1 misho 295: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1.1.1.4 ! misho 296: 0, 110, 0, 0, 1, 0, 0, 181, 0, 0,
1.1 misho 297: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
298: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1.1.1.4 ! misho 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,
1.1.1.3 misho 310: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1.1.1.4 ! misho 311: 0, 0, 0, 0,};
1.1 misho 312: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 313: const short sudoersgindex[] =
1.1 misho 314: #else
1.1.1.4 ! misho 315: short sudoersgindex[] =
1.1 misho 316: #endif
317: { 0,
1.1.1.4 ! misho 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,
1.1 misho 322: };
1.1.1.4 ! misho 323: #define YYTABLESIZE 970
1.1 misho 324: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 325: const short sudoerstable[] =
1.1 misho 326: #else
1.1.1.4 ! misho 327: short sudoerstable[] =
1.1 misho 328: #endif
1.1.1.4 ! misho 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,
1.1 misho 381: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1.1.1.4 ! misho 382: 10, 10, 10, 10, 10, 10, 8, 47, 8, 0,
! 383: 0, 8, 8, 8, 0, 8, 8, 8, 8, 8,
1.1 misho 384: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1.1.1.4 ! misho 385: 8, 8, 8, 8, 8, 8, 11, 48, 11, 0,
! 386: 0, 11, 11, 11, 0, 11, 11, 11, 11, 11,
1.1 misho 387: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1.1.1.4 ! misho 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,
1.1 misho 427: };
428: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 429: const short sudoerscheck[] =
1.1 misho 430: #else
1.1.1.4 ! misho 431: short sudoerscheck[] =
1.1 misho 432: #endif
433: { 33,
1.1.1.4 ! misho 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,
1.1 misho 488: -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1.1.1.4 ! misho 489: 280, 281, 282, 283, 284, 285, 256, 33, 258, -1,
! 490: -1, 261, 262, 263, -1, 265, 266, 267, 268, 269,
1.1 misho 491: -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1.1.1.4 ! misho 492: 280, 281, 282, 283, 284, 285, 256, 33, 258, -1,
! 493: -1, 261, 262, 263, -1, 265, 266, 267, 268, 269,
1.1 misho 494: -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1.1.1.4 ! misho 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,
1.1 misho 531: };
532: #define YYFINAL 18
533: #ifndef YYDEBUG
534: #define YYDEBUG 0
535: #endif
1.1.1.4 ! misho 536: #define YYMAXTOKEN 295
1.1 misho 537: #if YYDEBUG
538: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 539: const char * const sudoersname[] =
1.1 misho 540: #else
1.1.1.4 ! misho 541: char *sudoersname[] =
1.1 misho 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,
1.1.1.4 ! misho 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",
1.1 misho 557: };
558: #if defined(__cplusplus) || defined(__STDC__)
1.1.1.4 ! misho 559: const char * const sudoersrule[] =
1.1 misho 560: #else
1.1.1.4 ! misho 561: char *sudoersrule[] =
1.1 misho 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",
1.1.1.4 ! misho 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",
1.1 misho 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",
1.1.1.3 misho 615: "privsspec : PRIVS '=' WORD",
616: "limitprivsspec : LIMITPRIVS '=' WORD",
617: "solarisprivs :",
618: "solarisprivs : privsspec",
619: "solarisprivs : limitprivsspec",
620: "solarisprivs : privsspec limitprivsspec",
621: "solarisprivs : limitprivsspec privsspec",
1.1 misho 622: "runasspec :",
623: "runasspec : '(' runaslist ')'",
1.1.1.3 misho 624: "runaslist :",
1.1 misho 625: "runaslist : userlist",
626: "runaslist : userlist ':' grouplist",
627: "runaslist : ':' grouplist",
1.1.1.3 misho 628: "runaslist : ':'",
1.1 misho 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",
1.1.1.4 ! misho 651: "cmndlist : digcmnd",
! 652: "cmndlist : cmndlist ',' digcmnd",
1.1 misho 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;
1.1.1.4 ! misho 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:
1.1 misho 735: static struct defaults *
736: new_default(char *var, char *val, int op)
737: {
738: struct defaults *d;
1.1.1.2 misho 739: debug_decl(new_default, SUDO_DEBUG_PARSER)
1.1 misho 740:
1.1.1.2 misho 741: d = ecalloc(1, sizeof(struct defaults));
1.1 misho 742: d->var = var;
743: d->val = val;
744: tq_init(&d->binding);
1.1.1.2 misho 745: /* d->type = 0; */
1.1 misho 746: d->op = op;
747: d->prev = d;
1.1.1.2 misho 748: /* d->next = NULL; */
1.1 misho 749:
1.1.1.2 misho 750: debug_return_ptr(d);
1.1 misho 751: }
752:
753: static struct member *
754: new_member(char *name, int type)
755: {
756: struct member *m;
1.1.1.2 misho 757: debug_decl(new_member, SUDO_DEBUG_PARSER)
1.1 misho 758:
1.1.1.2 misho 759: m = ecalloc(1, sizeof(struct member));
1.1 misho 760: m->name = name;
761: m->type = type;
762: m->prev = m;
1.1.1.2 misho 763: /* m->next = NULL; */
1.1 misho 764:
1.1.1.2 misho 765: debug_return_ptr(m);
1.1 misho 766: }
767:
1.1.1.4 ! misho 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:
1.1 misho 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;
1.1.1.2 misho 791: debug_decl(add_defaults, SUDO_DEBUG_PARSER)
1.1 misho 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);
1.1.1.2 misho 807:
808: debug_return;
1.1 misho 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;
1.1.1.2 misho 819: debug_decl(add_userspec, SUDO_DEBUG_PARSER)
1.1 misho 820:
1.1.1.2 misho 821: u = ecalloc(1, sizeof(*u));
1.1 misho 822: list2tq(&u->users, members);
823: list2tq(&u->privileges, privs);
824: u->prev = u;
1.1.1.2 misho 825: /* u->next = NULL; */
1.1 misho 826: tq_append(&userspecs, u);
1.1.1.2 misho 827:
828: debug_return;
1.1 misho 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
1.1.1.3 misho 836: init_parser(const char *path, bool quiet)
1.1 misho 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;
1.1.1.2 misho 844: debug_decl(init_parser, SUDO_DEBUG_PARSER)
1.1 misho 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 */
1.1.1.3 misho 856: #ifdef HAVE_PRIV_SET
857: char *privs = NULL, *limitprivs = NULL;
858: #endif /* HAVE_PRIV_SET */
1.1 misho 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 */
1.1.1.3 misho 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 */
1.1 misho 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:
1.1.1.2 misho 943: parse_error = false;
1.1 misho 944: errorlineno = -1;
1.1.1.2 misho 945: errorfile = sudoers;
946: sudoers_warnings = !quiet;
947:
948: debug_return;
1.1 misho 949: }
1.1.1.4 ! misho 950: #line 898 "gram.c"
1.1 misho 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:
1.1.1.3 misho 962: newsize = yystacksize ? yystacksize : YYINITSTACKSIZE;
963: if (newsize >= YYMAXDEPTH)
1.1 misho 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
1.1.1.3 misho 972: if (YY_SIZE_MAX / newsize < sizeof *newss)
1.1 misho 973: goto bail;
1.1.1.3 misho 974: i = yyssp - yyss;
1.1 misho 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:
1.1.1.4 ! misho 1153: #line 185 "gram.y"
1.1 misho 1154: { ; }
1155: break;
1156: case 5:
1.1.1.4 ! misho 1157: #line 193 "gram.y"
1.1 misho 1158: {
1159: ;
1160: }
1161: break;
1162: case 6:
1.1.1.4 ! misho 1163: #line 196 "gram.y"
1.1 misho 1164: {
1165: yyerrok;
1166: }
1167: break;
1168: case 7:
1.1.1.4 ! misho 1169: #line 199 "gram.y"
1.1 misho 1170: {
1171: add_userspec(yyvsp[-1].member, yyvsp[0].privilege);
1172: }
1173: break;
1174: case 8:
1.1.1.4 ! misho 1175: #line 202 "gram.y"
1.1 misho 1176: {
1177: ;
1178: }
1179: break;
1180: case 9:
1.1.1.4 ! misho 1181: #line 205 "gram.y"
1.1 misho 1182: {
1183: ;
1184: }
1185: break;
1186: case 10:
1.1.1.4 ! misho 1187: #line 208 "gram.y"
1.1 misho 1188: {
1189: ;
1190: }
1191: break;
1192: case 11:
1.1.1.4 ! misho 1193: #line 211 "gram.y"
1.1 misho 1194: {
1195: ;
1196: }
1197: break;
1198: case 12:
1.1.1.4 ! misho 1199: #line 214 "gram.y"
1.1 misho 1200: {
1201: add_defaults(DEFAULTS, NULL, yyvsp[0].defaults);
1202: }
1203: break;
1204: case 13:
1.1.1.4 ! misho 1205: #line 217 "gram.y"
1.1 misho 1206: {
1207: add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults);
1208: }
1209: break;
1210: case 14:
1.1.1.4 ! misho 1211: #line 220 "gram.y"
1.1 misho 1212: {
1213: add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults);
1214: }
1215: break;
1216: case 15:
1.1.1.4 ! misho 1217: #line 223 "gram.y"
1.1 misho 1218: {
1219: add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults);
1220: }
1221: break;
1222: case 16:
1.1.1.4 ! misho 1223: #line 226 "gram.y"
1.1 misho 1224: {
1225: add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults);
1226: }
1227: break;
1228: case 18:
1.1.1.4 ! misho 1229: #line 232 "gram.y"
1.1 misho 1230: {
1231: list_append(yyvsp[-2].defaults, yyvsp[0].defaults);
1232: yyval.defaults = yyvsp[-2].defaults;
1233: }
1234: break;
1235: case 19:
1.1.1.4 ! misho 1236: #line 238 "gram.y"
1.1 misho 1237: {
1.1.1.2 misho 1238: yyval.defaults = new_default(yyvsp[0].string, NULL, true);
1.1 misho 1239: }
1240: break;
1241: case 20:
1.1.1.4 ! misho 1242: #line 241 "gram.y"
1.1 misho 1243: {
1.1.1.2 misho 1244: yyval.defaults = new_default(yyvsp[0].string, NULL, false);
1.1 misho 1245: }
1246: break;
1247: case 21:
1.1.1.4 ! misho 1248: #line 244 "gram.y"
1.1 misho 1249: {
1.1.1.2 misho 1250: yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true);
1.1 misho 1251: }
1252: break;
1253: case 22:
1.1.1.4 ! misho 1254: #line 247 "gram.y"
1.1 misho 1255: {
1256: yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
1257: }
1258: break;
1259: case 23:
1.1.1.4 ! misho 1260: #line 250 "gram.y"
1.1 misho 1261: {
1262: yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
1263: }
1264: break;
1265: case 25:
1.1.1.4 ! misho 1266: #line 256 "gram.y"
1.1 misho 1267: {
1268: list_append(yyvsp[-2].privilege, yyvsp[0].privilege);
1269: yyval.privilege = yyvsp[-2].privilege;
1270: }
1271: break;
1272: case 26:
1.1.1.4 ! misho 1273: #line 262 "gram.y"
1.1 misho 1274: {
1.1.1.2 misho 1275: struct privilege *p = ecalloc(1, sizeof(*p));
1.1 misho 1276: list2tq(&p->hostlist, yyvsp[-2].member);
1277: list2tq(&p->cmndlist, yyvsp[0].cmndspec);
1278: p->prev = p;
1.1.1.2 misho 1279: /* p->next = NULL; */
1.1 misho 1280: yyval.privilege = p;
1281: }
1282: break;
1283: case 27:
1.1.1.4 ! misho 1284: #line 272 "gram.y"
1.1 misho 1285: {
1286: yyval.member = yyvsp[0].member;
1.1.1.2 misho 1287: yyval.member->negated = false;
1.1 misho 1288: }
1289: break;
1290: case 28:
1.1.1.4 ! misho 1291: #line 276 "gram.y"
1.1 misho 1292: {
1293: yyval.member = yyvsp[0].member;
1.1.1.2 misho 1294: yyval.member->negated = true;
1.1 misho 1295: }
1296: break;
1297: case 29:
1.1.1.4 ! misho 1298: #line 282 "gram.y"
1.1 misho 1299: {
1300: yyval.member = new_member(yyvsp[0].string, ALIAS);
1301: }
1302: break;
1303: case 30:
1.1.1.4 ! misho 1304: #line 285 "gram.y"
1.1 misho 1305: {
1306: yyval.member = new_member(NULL, ALL);
1307: }
1308: break;
1309: case 31:
1.1.1.4 ! misho 1310: #line 288 "gram.y"
1.1 misho 1311: {
1312: yyval.member = new_member(yyvsp[0].string, NETGROUP);
1313: }
1314: break;
1315: case 32:
1.1.1.4 ! misho 1316: #line 291 "gram.y"
1.1 misho 1317: {
1318: yyval.member = new_member(yyvsp[0].string, NTWKADDR);
1319: }
1320: break;
1321: case 33:
1.1.1.4 ! misho 1322: #line 294 "gram.y"
1.1 misho 1323: {
1324: yyval.member = new_member(yyvsp[0].string, WORD);
1325: }
1326: break;
1327: case 35:
1.1.1.4 ! misho 1328: #line 300 "gram.y"
1.1 misho 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 */
1.1.1.3 misho 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 */
1.1 misho 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:
1.1.1.4 ! misho 1368: #line 339 "gram.y"
1.1 misho 1369: {
1.1.1.2 misho 1370: struct cmndspec *cs = ecalloc(1, sizeof(*cs));
1.1.1.3 misho 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);
1.1 misho 1375: } else {
1376: tq_init(&cs->runasuserlist);
1377: tq_init(&cs->runasgrouplist);
1378: }
1379: #ifdef HAVE_SELINUX
1.1.1.3 misho 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;
1.1 misho 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:
1.1.1.4 ! misho 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"
1.1 misho 1439: {
1440: yyval.member = yyvsp[0].member;
1.1.1.2 misho 1441: yyval.member->negated = false;
1.1 misho 1442: }
1443: break;
1.1.1.4 ! misho 1444: case 44:
! 1445: #line 398 "gram.y"
1.1 misho 1446: {
1447: yyval.member = yyvsp[0].member;
1.1.1.2 misho 1448: yyval.member->negated = true;
1.1 misho 1449: }
1450: break;
1.1.1.4 ! misho 1451: case 45:
! 1452: #line 404 "gram.y"
1.1 misho 1453: {
1454: yyval.string = yyvsp[0].string;
1455: }
1456: break;
1.1.1.4 ! misho 1457: case 46:
! 1458: #line 409 "gram.y"
1.1 misho 1459: {
1460: yyval.string = yyvsp[0].string;
1461: }
1462: break;
1.1.1.4 ! misho 1463: case 47:
! 1464: #line 414 "gram.y"
1.1 misho 1465: {
1466: yyval.seinfo.role = NULL;
1467: yyval.seinfo.type = NULL;
1468: }
1469: break;
1.1.1.4 ! misho 1470: case 48:
! 1471: #line 418 "gram.y"
1.1 misho 1472: {
1473: yyval.seinfo.role = yyvsp[0].string;
1474: yyval.seinfo.type = NULL;
1475: }
1476: break;
1.1.1.4 ! misho 1477: case 49:
! 1478: #line 422 "gram.y"
1.1 misho 1479: {
1480: yyval.seinfo.type = yyvsp[0].string;
1481: yyval.seinfo.role = NULL;
1482: }
1483: break;
1.1.1.4 ! misho 1484: case 50:
! 1485: #line 426 "gram.y"
1.1 misho 1486: {
1487: yyval.seinfo.role = yyvsp[-1].string;
1488: yyval.seinfo.type = yyvsp[0].string;
1489: }
1490: break;
1.1.1.4 ! misho 1491: case 51:
! 1492: #line 430 "gram.y"
1.1 misho 1493: {
1494: yyval.seinfo.type = yyvsp[-1].string;
1495: yyval.seinfo.role = yyvsp[0].string;
1496: }
1497: break;
1.1.1.4 ! misho 1498: case 52:
! 1499: #line 436 "gram.y"
1.1 misho 1500: {
1.1.1.3 misho 1501: yyval.string = yyvsp[0].string;
1.1 misho 1502: }
1503: break;
1.1.1.4 ! misho 1504: case 53:
! 1505: #line 440 "gram.y"
1.1 misho 1506: {
1.1.1.3 misho 1507: yyval.string = yyvsp[0].string;
1.1 misho 1508: }
1509: break;
1.1.1.4 ! misho 1510: case 54:
! 1511: #line 445 "gram.y"
1.1.1.3 misho 1512: {
1513: yyval.privinfo.privs = NULL;
1514: yyval.privinfo.limitprivs = NULL;
1515: }
1516: break;
1.1.1.4 ! misho 1517: case 55:
! 1518: #line 449 "gram.y"
1.1.1.3 misho 1519: {
1520: yyval.privinfo.privs = yyvsp[0].string;
1521: yyval.privinfo.limitprivs = NULL;
1522: }
1523: break;
1.1.1.4 ! misho 1524: case 56:
! 1525: #line 453 "gram.y"
1.1.1.3 misho 1526: {
1527: yyval.privinfo.privs = NULL;
1528: yyval.privinfo.limitprivs = yyvsp[0].string;
1529: }
1530: break;
1.1.1.4 ! misho 1531: case 57:
! 1532: #line 457 "gram.y"
1.1.1.3 misho 1533: {
1534: yyval.privinfo.privs = yyvsp[-1].string;
1535: yyval.privinfo.limitprivs = yyvsp[0].string;
1536: }
1537: break;
1.1.1.4 ! misho 1538: case 58:
! 1539: #line 461 "gram.y"
1.1.1.3 misho 1540: {
1541: yyval.privinfo.limitprivs = yyvsp[-1].string;
1542: yyval.privinfo.privs = yyvsp[0].string;
1543: }
1544: break;
1.1.1.4 ! misho 1545: case 59:
! 1546: #line 467 "gram.y"
1.1.1.3 misho 1547: {
1548: yyval.runas = NULL;
1549: }
1550: break;
1.1.1.4 ! misho 1551: case 60:
! 1552: #line 470 "gram.y"
1.1.1.3 misho 1553: {
1554: yyval.runas = yyvsp[-1].runas;
1555: }
1556: break;
1.1.1.4 ! misho 1557: case 61:
! 1558: #line 475 "gram.y"
1.1.1.3 misho 1559: {
1560: yyval.runas = ecalloc(1, sizeof(struct runascontainer));
1561: yyval.runas->runasusers = new_member(NULL, MYSELF);
1562: /* $$->runasgroups = NULL; */
1563: }
1564: break;
1.1.1.4 ! misho 1565: case 62:
! 1566: #line 480 "gram.y"
1.1 misho 1567: {
1.1.1.2 misho 1568: yyval.runas = ecalloc(1, sizeof(struct runascontainer));
1.1 misho 1569: yyval.runas->runasusers = yyvsp[0].member;
1.1.1.2 misho 1570: /* $$->runasgroups = NULL; */
1.1 misho 1571: }
1572: break;
1.1.1.4 ! misho 1573: case 63:
! 1574: #line 485 "gram.y"
1.1 misho 1575: {
1.1.1.2 misho 1576: yyval.runas = ecalloc(1, sizeof(struct runascontainer));
1.1 misho 1577: yyval.runas->runasusers = yyvsp[-2].member;
1578: yyval.runas->runasgroups = yyvsp[0].member;
1579: }
1580: break;
1.1.1.4 ! misho 1581: case 64:
! 1582: #line 490 "gram.y"
1.1 misho 1583: {
1.1.1.2 misho 1584: yyval.runas = ecalloc(1, sizeof(struct runascontainer));
1585: /* $$->runasusers = NULL; */
1.1 misho 1586: yyval.runas->runasgroups = yyvsp[0].member;
1587: }
1588: break;
1.1.1.4 ! misho 1589: case 65:
! 1590: #line 495 "gram.y"
1.1.1.3 misho 1591: {
1592: yyval.runas = ecalloc(1, sizeof(struct runascontainer));
1593: yyval.runas->runasusers = new_member(NULL, MYSELF);
1594: /* $$->runasgroups = NULL; */
1595: }
1596: break;
1.1.1.4 ! misho 1597: case 66:
! 1598: #line 502 "gram.y"
1.1 misho 1599: {
1600: yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv =
1601: yyval.tag.log_input = yyval.tag.log_output = UNSPEC;
1602: }
1603: break;
1.1.1.4 ! misho 1604: case 67:
! 1605: #line 506 "gram.y"
1.1 misho 1606: {
1.1.1.2 misho 1607: yyval.tag.nopasswd = true;
1.1 misho 1608: }
1609: break;
1.1.1.4 ! misho 1610: case 68:
! 1611: #line 509 "gram.y"
1.1 misho 1612: {
1.1.1.2 misho 1613: yyval.tag.nopasswd = false;
1.1 misho 1614: }
1615: break;
1.1.1.4 ! misho 1616: case 69:
! 1617: #line 512 "gram.y"
1.1 misho 1618: {
1.1.1.2 misho 1619: yyval.tag.noexec = true;
1.1 misho 1620: }
1621: break;
1.1.1.4 ! misho 1622: case 70:
! 1623: #line 515 "gram.y"
1.1 misho 1624: {
1.1.1.2 misho 1625: yyval.tag.noexec = false;
1.1 misho 1626: }
1627: break;
1.1.1.4 ! misho 1628: case 71:
! 1629: #line 518 "gram.y"
1.1 misho 1630: {
1.1.1.2 misho 1631: yyval.tag.setenv = true;
1.1 misho 1632: }
1633: break;
1.1.1.4 ! misho 1634: case 72:
! 1635: #line 521 "gram.y"
1.1 misho 1636: {
1.1.1.2 misho 1637: yyval.tag.setenv = false;
1.1 misho 1638: }
1639: break;
1.1.1.4 ! misho 1640: case 73:
! 1641: #line 524 "gram.y"
1.1 misho 1642: {
1.1.1.2 misho 1643: yyval.tag.log_input = true;
1.1 misho 1644: }
1645: break;
1.1.1.4 ! misho 1646: case 74:
! 1647: #line 527 "gram.y"
1.1 misho 1648: {
1.1.1.2 misho 1649: yyval.tag.log_input = false;
1.1 misho 1650: }
1651: break;
1.1.1.4 ! misho 1652: case 75:
! 1653: #line 530 "gram.y"
1.1 misho 1654: {
1.1.1.2 misho 1655: yyval.tag.log_output = true;
1.1 misho 1656: }
1657: break;
1.1.1.4 ! misho 1658: case 76:
! 1659: #line 533 "gram.y"
1.1 misho 1660: {
1.1.1.2 misho 1661: yyval.tag.log_output = false;
1.1 misho 1662: }
1663: break;
1.1.1.4 ! misho 1664: case 77:
! 1665: #line 538 "gram.y"
1.1 misho 1666: {
1667: yyval.member = new_member(NULL, ALL);
1668: }
1669: break;
1.1.1.4 ! misho 1670: case 78:
! 1671: #line 541 "gram.y"
1.1 misho 1672: {
1673: yyval.member = new_member(yyvsp[0].string, ALIAS);
1674: }
1675: break;
1.1.1.4 ! misho 1676: case 79:
! 1677: #line 544 "gram.y"
1.1 misho 1678: {
1.1.1.2 misho 1679: struct sudo_command *c = ecalloc(1, sizeof(*c));
1.1 misho 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;
1.1.1.4 ! misho 1685: case 82:
! 1686: #line 556 "gram.y"
1.1 misho 1687: {
1688: char *s;
1689: if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
1.1.1.4 ! misho 1690: sudoerserror(s);
1.1 misho 1691: YYERROR;
1692: }
1693: }
1694: break;
1.1.1.4 ! misho 1695: case 84:
! 1696: #line 566 "gram.y"
1.1 misho 1697: {
1698: list_append(yyvsp[-2].member, yyvsp[0].member);
1699: yyval.member = yyvsp[-2].member;
1700: }
1701: break;
1.1.1.4 ! misho 1702: case 87:
! 1703: #line 576 "gram.y"
1.1 misho 1704: {
1705: char *s;
1706: if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
1.1.1.4 ! misho 1707: sudoerserror(s);
1.1 misho 1708: YYERROR;
1709: }
1710: }
1711: break;
1.1.1.4 ! misho 1712: case 89:
! 1713: #line 586 "gram.y"
1.1 misho 1714: {
1715: list_append(yyvsp[-2].member, yyvsp[0].member);
1716: yyval.member = yyvsp[-2].member;
1717: }
1718: break;
1.1.1.4 ! misho 1719: case 92:
! 1720: #line 596 "gram.y"
1.1 misho 1721: {
1722: char *s;
1723: if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
1.1.1.4 ! misho 1724: sudoerserror(s);
1.1 misho 1725: YYERROR;
1726: }
1727: }
1728: break;
1.1.1.4 ! misho 1729: case 95:
! 1730: #line 609 "gram.y"
1.1 misho 1731: {
1732: char *s;
1733: if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
1.1.1.4 ! misho 1734: sudoerserror(s);
1.1 misho 1735: YYERROR;
1736: }
1737: }
1738: break;
1.1.1.4 ! misho 1739: case 97:
! 1740: #line 619 "gram.y"
1.1 misho 1741: {
1742: list_append(yyvsp[-2].member, yyvsp[0].member);
1743: yyval.member = yyvsp[-2].member;
1744: }
1745: break;
1.1.1.4 ! misho 1746: case 98:
! 1747: #line 625 "gram.y"
1.1 misho 1748: {
1749: yyval.member = yyvsp[0].member;
1.1.1.2 misho 1750: yyval.member->negated = false;
1.1 misho 1751: }
1752: break;
1.1.1.4 ! misho 1753: case 99:
! 1754: #line 629 "gram.y"
1.1 misho 1755: {
1756: yyval.member = yyvsp[0].member;
1.1.1.2 misho 1757: yyval.member->negated = true;
1.1 misho 1758: }
1759: break;
1.1.1.4 ! misho 1760: case 100:
! 1761: #line 635 "gram.y"
1.1 misho 1762: {
1763: yyval.member = new_member(yyvsp[0].string, ALIAS);
1764: }
1765: break;
1.1.1.4 ! misho 1766: case 101:
! 1767: #line 638 "gram.y"
1.1 misho 1768: {
1769: yyval.member = new_member(NULL, ALL);
1770: }
1771: break;
1.1.1.4 ! misho 1772: case 102:
! 1773: #line 641 "gram.y"
1.1 misho 1774: {
1775: yyval.member = new_member(yyvsp[0].string, NETGROUP);
1776: }
1777: break;
1.1.1.4 ! misho 1778: case 103:
! 1779: #line 644 "gram.y"
1.1 misho 1780: {
1781: yyval.member = new_member(yyvsp[0].string, USERGROUP);
1782: }
1783: break;
1.1.1.4 ! misho 1784: case 104:
! 1785: #line 647 "gram.y"
1.1 misho 1786: {
1787: yyval.member = new_member(yyvsp[0].string, WORD);
1788: }
1789: break;
1.1.1.4 ! misho 1790: case 106:
! 1791: #line 653 "gram.y"
1.1 misho 1792: {
1793: list_append(yyvsp[-2].member, yyvsp[0].member);
1794: yyval.member = yyvsp[-2].member;
1795: }
1796: break;
1.1.1.4 ! misho 1797: case 107:
! 1798: #line 659 "gram.y"
1.1 misho 1799: {
1800: yyval.member = yyvsp[0].member;
1.1.1.2 misho 1801: yyval.member->negated = false;
1.1 misho 1802: }
1803: break;
1.1.1.4 ! misho 1804: case 108:
! 1805: #line 663 "gram.y"
1.1 misho 1806: {
1807: yyval.member = yyvsp[0].member;
1.1.1.2 misho 1808: yyval.member->negated = true;
1.1 misho 1809: }
1810: break;
1.1.1.4 ! misho 1811: case 109:
! 1812: #line 669 "gram.y"
1.1 misho 1813: {
1814: yyval.member = new_member(yyvsp[0].string, ALIAS);
1815: }
1816: break;
1.1.1.4 ! misho 1817: case 110:
! 1818: #line 672 "gram.y"
1.1 misho 1819: {
1820: yyval.member = new_member(NULL, ALL);
1821: }
1822: break;
1.1.1.4 ! misho 1823: case 111:
! 1824: #line 675 "gram.y"
1.1 misho 1825: {
1826: yyval.member = new_member(yyvsp[0].string, WORD);
1827: }
1828: break;
1.1.1.4 ! misho 1829: #line 1777 "gram.c"
1.1 misho 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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>