File: | src/usr.sbin/sasyncd/obj/conf.c |
Warning: | line 533, column 12 Use of zero-allocated memory |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | #include <stdlib.h> | |||
2 | #include <string.h> | |||
3 | #define YYBYACC1 1 | |||
4 | #define YYMAJOR1 1 | |||
5 | #define YYMINOR9 9 | |||
6 | #define YYLEXyylex() yylex() | |||
7 | #define YYEMPTY-1 -1 | |||
8 | #define yyclearin(yychar=(-1)) (yychar=(YYEMPTY-1)) | |||
9 | #define yyerrok(yyerrflag=0) (yyerrflag=0) | |||
10 | #define YYRECOVERING()(yyerrflag!=0) (yyerrflag!=0) | |||
11 | #define YYPREFIX"yy" "yy" | |||
12 | #line 30 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
13 | #include <sys/types.h> | |||
14 | #include <sys/stat.h> | |||
15 | #include <sys/socket.h> | |||
16 | #include <ctype.h> | |||
17 | #include <fcntl.h> | |||
18 | #include <stdio.h> | |||
19 | #include <stdlib.h> | |||
20 | #include <string.h> | |||
21 | #include <unistd.h> | |||
22 | #include <pwd.h> | |||
23 | ||||
24 | #include "sasyncd.h" | |||
25 | #include "net.h" | |||
26 | ||||
27 | /* Global configuration context. */ | |||
28 | struct cfgstate cfgstate; | |||
29 | ||||
30 | /* Local variables */ | |||
31 | int conflen = 0; | |||
32 | char *confbuf, *confptr; | |||
33 | ||||
34 | int yyparse(void); | |||
35 | int yylex(void); | |||
36 | void yyerror(const char *); | |||
37 | unsigned char x2i(unsigned char *); | |||
38 | #line 57 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
39 | #ifndef YYSTYPE_DEFINED | |||
40 | #define YYSTYPE_DEFINED | |||
41 | typedef union { | |||
42 | char *string; | |||
43 | int val; | |||
44 | struct { | |||
45 | unsigned char *data; | |||
46 | int len; | |||
47 | } hex; | |||
48 | } YYSTYPE; | |||
49 | #endif /* YYSTYPE_DEFINED */ | |||
50 | #line 51 "conf.c" | |||
51 | #define MODE257 257 | |||
52 | #define INTERFACE258 258 | |||
53 | #define INTERVAL259 259 | |||
54 | #define LISTEN260 260 | |||
55 | #define ON261 261 | |||
56 | #define PORT262 262 | |||
57 | #define PEER263 263 | |||
58 | #define SHAREDKEY264 264 | |||
59 | #define Y_SLAVE265 265 | |||
60 | #define Y_MASTER266 266 | |||
61 | #define INET267 267 | |||
62 | #define INET6268 268 | |||
63 | #define FLUSHMODE269 269 | |||
64 | #define STARTUP270 270 | |||
65 | #define NEVER271 271 | |||
66 | #define SYNC272 272 | |||
67 | #define GROUP273 273 | |||
68 | #define SKIPSLAVE274 274 | |||
69 | #define CONTROL275 275 | |||
70 | #define STRING276 276 | |||
71 | #define HEX277 277 | |||
72 | #define VALUE278 278 | |||
73 | #define YYERRCODE256 256 | |||
74 | const short yylhs[] = | |||
75 | { -1, | |||
76 | 0, 0, 1, 1, 1, 2, 2, 3, 3, 7, | |||
77 | 7, 4, 4, 4, 8, 8, 5, 6, 6, 6, | |||
78 | 6, 6, 6, 6, 6, | |||
79 | }; | |||
80 | const short yylen[] = | |||
81 | { 2, | |||
82 | 0, 2, 0, 1, 1, 0, 2, 1, 1, 1, | |||
83 | 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, | |||
84 | 2, 5, 2, 2, 2, | |||
85 | }; | |||
86 | const short yydefred[] = | |||
87 | { 1, | |||
88 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, | |||
89 | 9, 8, 10, 11, 23, 18, 0, 21, 15, 16, | |||
90 | 24, 12, 13, 14, 20, 19, 17, 25, 0, 4, | |||
91 | 5, 0, 0, 22, 7, | |||
92 | }; | |||
93 | const short yydgoto[] = | |||
94 | { 1, | |||
95 | 32, 34, 14, 25, 28, 10, 15, 21, | |||
96 | }; | |||
97 | const short yysindex[] = | |||
98 | { 0, | |||
99 | -253, -251, -276, -244, -270, -274, -246, -268, -258, 0, | |||
100 | 0, 0, 0, 0, 0, 0, -257, 0, 0, 0, | |||
101 | 0, 0, 0, 0, 0, 0, 0, 0, -255, 0, | |||
102 | 0, -241, -250, 0, 0,}; | |||
103 | const short yyrindex[] = | |||
104 | { 0, | |||
105 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
106 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
107 | 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, | |||
108 | 0, 9, 0, 0, 0,}; | |||
109 | const short yygindex[] = | |||
110 | { 0, | |||
111 | 0, 0, 0, 0, 0, 0, 0, 0, | |||
112 | }; | |||
113 | #define YYTABLESIZE284 284 | |||
114 | const short yytable[] = | |||
115 | { 16, | |||
116 | 3, 19, 20, 2, 3, 18, 4, 26, 6, 5, | |||
117 | 6, 30, 31, 11, 12, 7, 17, 27, 29, 8, | |||
118 | 33, 9, 13, 22, 23, 24, 0, 35, 0, 0, | |||
119 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
120 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
121 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
122 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
123 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
124 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
125 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
126 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
127 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
128 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
129 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
130 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
131 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
132 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
133 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
134 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
135 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
136 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
137 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
138 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
139 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
140 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
141 | 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, | |||
142 | 3, 0, 3, 3, 3, 6, 6, 0, 6, 3, | |||
143 | 0, 6, 6, 3, 0, 3, 0, 6, 0, 0, | |||
144 | 0, 6, 0, 6, | |||
145 | }; | |||
146 | const short yycheck[] = | |||
147 | { 276, | |||
148 | 0, 276, 277, 257, 258, 276, 260, 276, 0, 263, | |||
149 | 264, 267, 268, 265, 266, 269, 261, 276, 276, 273, | |||
150 | 262, 275, 274, 270, 271, 272, -1, 278, -1, -1, | |||
151 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
152 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
153 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
154 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
155 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
156 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
157 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
158 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
159 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
160 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
161 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
162 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
163 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
164 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
165 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
166 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
167 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
168 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
169 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
170 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
171 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
172 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |||
173 | -1, -1, -1, -1, -1, -1, -1, 257, 258, -1, | |||
174 | 260, -1, 262, 263, 264, 257, 258, -1, 260, 269, | |||
175 | -1, 263, 264, 273, -1, 275, -1, 269, -1, -1, | |||
176 | -1, 273, -1, 275, | |||
177 | }; | |||
178 | #define YYFINAL1 1 | |||
179 | #ifndef YYDEBUG0 | |||
180 | #define YYDEBUG0 0 | |||
181 | #endif | |||
182 | #define YYMAXTOKEN278 278 | |||
183 | #if YYDEBUG0 | |||
184 | const char * const yyname[] = | |||
185 | { | |||
186 | "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,0, | |||
187 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | |||
188 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | |||
189 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | |||
190 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | |||
191 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | |||
192 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"MODE","INTERFACE","INTERVAL", | |||
193 | "LISTEN","ON","PORT","PEER","SHAREDKEY","Y_SLAVE","Y_MASTER","INET","INET6", | |||
194 | "FLUSHMODE","STARTUP","NEVER","SYNC","GROUP","SKIPSLAVE","CONTROL","STRING", | |||
195 | "HEX","VALUE", | |||
196 | }; | |||
197 | const char * const yyrule[] = | |||
198 | {"$accept : settings", | |||
199 | "settings :", | |||
200 | "settings : settings setting", | |||
201 | "af :", | |||
202 | "af : INET", | |||
203 | "af : INET6", | |||
204 | "port :", | |||
205 | "port : PORT VALUE", | |||
206 | "mode : Y_MASTER", | |||
207 | "mode : Y_SLAVE", | |||
208 | "modes : SKIPSLAVE", | |||
209 | "modes : mode", | |||
210 | "flushmode : STARTUP", | |||
211 | "flushmode : NEVER", | |||
212 | "flushmode : SYNC", | |||
213 | "key : STRING", | |||
214 | "key : HEX", | |||
215 | "ctlmode : STRING", | |||
216 | "setting : INTERFACE STRING", | |||
217 | "setting : GROUP STRING", | |||
218 | "setting : FLUSHMODE flushmode", | |||
219 | "setting : PEER STRING", | |||
220 | "setting : LISTEN ON STRING af port", | |||
221 | "setting : MODE modes", | |||
222 | "setting : SHAREDKEY key", | |||
223 | "setting : CONTROL ctlmode", | |||
224 | }; | |||
225 | #endif | |||
226 | #ifdef YYSTACKSIZE10000 | |||
227 | #undef YYMAXDEPTH10000 | |||
228 | #define YYMAXDEPTH10000 YYSTACKSIZE10000 | |||
229 | #else | |||
230 | #ifdef YYMAXDEPTH10000 | |||
231 | #define YYSTACKSIZE10000 YYMAXDEPTH10000 | |||
232 | #else | |||
233 | #define YYSTACKSIZE10000 10000 | |||
234 | #define YYMAXDEPTH10000 10000 | |||
235 | #endif | |||
236 | #endif | |||
237 | #define YYINITSTACKSIZE200 200 | |||
238 | /* LINTUSED */ | |||
239 | int yydebug; | |||
240 | int yynerrs; | |||
241 | int yyerrflag; | |||
242 | int yychar; | |||
243 | short *yyssp; | |||
244 | YYSTYPE *yyvsp; | |||
245 | YYSTYPE yyval; | |||
246 | YYSTYPE yylval; | |||
247 | short *yyss; | |||
248 | short *yysslim; | |||
249 | YYSTYPE *yyvs; | |||
250 | unsigned int yystacksize; | |||
251 | int yyparse(void); | |||
252 | #line 241 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
253 | /* Program */ | |||
254 | ||||
255 | struct keyword { | |||
256 | char *name; | |||
257 | int value; | |||
258 | }; | |||
259 | ||||
260 | static int | |||
261 | match_cmp(const void *a, const void *b) | |||
262 | { | |||
263 | return strcmp(a, ((const struct keyword *)b)->name); | |||
264 | } | |||
265 | ||||
266 | static int | |||
267 | match(char *token) | |||
268 | { | |||
269 | /* Sorted */ | |||
270 | static const struct keyword keywords[] = { | |||
271 | { "control", CONTROL275 }, | |||
272 | { "flushmode", FLUSHMODE269 }, | |||
273 | { "group", GROUP273 }, | |||
274 | { "inet", INET267 }, | |||
275 | { "inet6", INET6268 }, | |||
276 | { "interface", INTERFACE258 }, | |||
277 | { "listen", LISTEN260 }, | |||
278 | { "master", Y_MASTER266 }, | |||
279 | { "mode", MODE257 }, | |||
280 | { "never", NEVER271 }, | |||
281 | { "on", ON261 }, | |||
282 | { "peer", PEER263 }, | |||
283 | { "port", PORT262 }, | |||
284 | { "sharedkey", SHAREDKEY264 }, | |||
285 | { "skipslave", SKIPSLAVE274 }, | |||
286 | { "slave", Y_SLAVE265 }, | |||
287 | { "startup", STARTUP270 }, | |||
288 | { "sync", SYNC272 }, | |||
289 | }; | |||
290 | const struct keyword *k; | |||
291 | ||||
292 | k = bsearch(token, keywords, sizeof keywords / sizeof keywords[0], | |||
293 | sizeof keywords[0], match_cmp); | |||
294 | ||||
295 | return k ? k->value : STRING276; | |||
296 | } | |||
297 | ||||
298 | int | |||
299 | yylex(void) | |||
300 | { | |||
301 | char *p; | |||
302 | int v, i, len; | |||
303 | ||||
304 | /* Locate next token */ | |||
305 | if (!confptr) | |||
306 | confptr = confbuf; | |||
307 | else { | |||
308 | for (p = confptr; p < confbuf + conflen && *p; p++) | |||
309 | ; | |||
310 | if (p == confbuf + conflen) | |||
311 | return 0; | |||
312 | p++; | |||
313 | if (!*p) | |||
314 | return 0; | |||
315 | confptr = p; | |||
316 | } | |||
317 | ||||
318 | /* Hex token? */ | |||
319 | p = confptr; | |||
320 | if (!strncmp(p, "0x", 2)) { | |||
321 | for (p = confptr + 2; *p; p++) | |||
322 | if (!isxdigit(*p)) | |||
323 | goto is_string; | |||
324 | p = confptr + 2; | |||
325 | len = strlen(p) / 2; | |||
326 | if ((yylval.hex.data = calloc(len, sizeof(unsigned char))) | |||
327 | == NULL((void *)0)) { | |||
328 | log_err("yylex: calloc()"); | |||
329 | exit(1); | |||
330 | } | |||
331 | for (i = 0; i < len; i++) | |||
332 | yylval.hex.data[i] = x2i(p + 2 * i); | |||
333 | yylval.hex.len = len; | |||
334 | return HEX277; | |||
335 | } | |||
336 | ||||
337 | /* Numerical token? */ | |||
338 | if (isdigit(*confptr)) { | |||
339 | for (p = confptr; *p; p++) | |||
340 | if (*p == '.' || *p == ':') /* IP address, or bad input */ | |||
341 | goto is_string; | |||
342 | v = (int)strtol(confptr, (char **)NULL((void *)0), 10); | |||
343 | yylval.val = v; | |||
344 | return VALUE278; | |||
345 | } | |||
346 | ||||
347 | is_string: | |||
348 | v = match(confptr); | |||
349 | if (v == STRING276) { | |||
350 | yylval.string = strdup(confptr); | |||
351 | if (!yylval.string) { | |||
352 | log_err("yylex: strdup()"); | |||
353 | exit(1); | |||
354 | } | |||
355 | } | |||
356 | return v; | |||
357 | } | |||
358 | ||||
359 | int | |||
360 | conf_parse_file(char *cfgfile) | |||
361 | { | |||
362 | struct stat st; | |||
363 | int fd, r; | |||
364 | char *buf, *s, *d; | |||
365 | struct passwd *pw; | |||
366 | ||||
367 | if (stat(cfgfile, &st) != 0) | |||
368 | goto bad; | |||
369 | ||||
370 | pw = getpwnam(SASYNCD_USER"_isakmpd"); | |||
371 | if (pw == NULL((void *)0)) { | |||
372 | log_err("getpwnam(%s) failed", SASYNCD_USER"_isakmpd"); | |||
373 | return 1; | |||
374 | } | |||
375 | ||||
376 | /* Valid file? */ | |||
377 | if ((st.st_uid && st.st_uid != pw->pw_uid) || | |||
378 | ((st.st_mode & S_IFMT0170000) != S_IFREG0100000) || | |||
379 | ((st.st_mode & (S_IRWXG0000070 | S_IRWXO0000007)) != 0)) { | |||
380 | log_msg(0, "configuration file has bad owner, type or mode"); | |||
381 | goto bad; | |||
382 | } | |||
383 | ||||
384 | fd = open(cfgfile, O_RDONLY0x0000); | |||
385 | if (fd == -1) | |||
386 | goto bad; | |||
387 | ||||
388 | conflen = st.st_size; | |||
389 | buf = malloc(conflen + 1); | |||
390 | if (!buf) { | |||
391 | log_err("malloc(%d) failed", conflen + 1); | |||
392 | close(fd); | |||
393 | return 1; | |||
394 | } | |||
395 | ||||
396 | if (read(fd, buf, conflen) != conflen) { | |||
397 | log_err("read() failed"); | |||
398 | free(buf); | |||
399 | close(fd); | |||
400 | return 1; | |||
401 | } | |||
402 | close(fd); | |||
403 | ||||
404 | /* Prepare the buffer somewhat in the way of strsep() */ | |||
405 | buf[conflen] = (char)0; | |||
406 | for (s = buf, d = s; s < buf + conflen && *s; s++) { | |||
407 | if (isspace(*s) && isspace(*(s+1))) | |||
408 | continue; | |||
409 | if (*s == '#') { | |||
410 | while (*s != '\n' && s < buf + conflen) | |||
411 | s++; | |||
412 | while (*s == '\n' && s < buf + conflen) | |||
413 | s++; | |||
414 | s--; | |||
415 | continue; | |||
416 | } | |||
417 | if (d == buf && isspace(*s)) | |||
418 | continue; | |||
419 | *d++ = *s; | |||
420 | } | |||
421 | *d = (char)0; | |||
422 | for (s = buf; s <= d; s++) | |||
423 | if (isspace(*s)) | |||
424 | *s = (char)0; | |||
425 | ||||
426 | confbuf = buf; | |||
427 | confptr = NULL((void *)0); | |||
428 | r = yyparse(); | |||
429 | free(buf); | |||
430 | ||||
431 | if (!cfgstate.carp_ifgroup) | |||
432 | cfgstate.carp_ifgroup = strdup("carp"); | |||
433 | ||||
434 | return r; | |||
435 | ||||
436 | bad: | |||
437 | log_msg(0, "failed to open \"%s\"", cfgfile); | |||
438 | return 1; | |||
439 | } | |||
440 | ||||
441 | unsigned char | |||
442 | x2i(unsigned char *s) | |||
443 | { | |||
444 | char ss[3]; | |||
445 | ||||
446 | ss[0] = s[0]; | |||
447 | ss[1] = s[1]; | |||
448 | ss[2] = 0; | |||
449 | ||||
450 | return ((unsigned char)strtoul(ss, NULL((void *)0), 16)); | |||
451 | } | |||
452 | ||||
453 | void | |||
454 | yyerror(const char *s) | |||
455 | { | |||
456 | fprintf(stderr(&__sF[2]), "config: %s\n", s); | |||
457 | } | |||
458 | #line 451 "conf.c" | |||
459 | /* allocate initial stack or double stack size, up to YYMAXDEPTH */ | |||
460 | static int yygrowstack(void) | |||
461 | { | |||
462 | unsigned int newsize; | |||
463 | long sslen; | |||
464 | short *newss; | |||
465 | YYSTYPE *newvs; | |||
466 | ||||
467 | if ((newsize = yystacksize) == 0) | |||
468 | newsize = YYINITSTACKSIZE200; | |||
469 | else if (newsize >= YYMAXDEPTH10000) | |||
470 | return -1; | |||
471 | else if ((newsize *= 2) > YYMAXDEPTH10000) | |||
472 | newsize = YYMAXDEPTH10000; | |||
473 | sslen = yyssp - yyss; | |||
474 | #ifdef SIZE_MAX | |||
475 | #define YY_SIZE_MAX0xffffffffU SIZE_MAX | |||
476 | #else | |||
477 | #define YY_SIZE_MAX0xffffffffU 0xffffffffU | |||
478 | #endif | |||
479 | if (newsize && YY_SIZE_MAX0xffffffffU / newsize < sizeof *newss) | |||
480 | goto bail; | |||
481 | newss = (short *)realloc(yyss, newsize * sizeof *newss); | |||
482 | if (newss == NULL((void *)0)) | |||
483 | goto bail; | |||
484 | yyss = newss; | |||
485 | yyssp = newss + sslen; | |||
486 | if (newsize
| |||
487 | goto bail; | |||
488 | newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs); | |||
489 | if (newvs == NULL((void *)0)) | |||
490 | goto bail; | |||
491 | yyvs = newvs; | |||
492 | yyvsp = newvs + sslen; | |||
493 | yystacksize = newsize; | |||
494 | yysslim = yyss + newsize - 1; | |||
495 | return 0; | |||
496 | bail: | |||
497 | if (yyss) | |||
498 | free(yyss); | |||
499 | if (yyvs) | |||
500 | free(yyvs); | |||
501 | yyss = yyssp = NULL((void *)0); | |||
502 | yyvs = yyvsp = NULL((void *)0); | |||
503 | yystacksize = 0; | |||
504 | return -1; | |||
505 | } | |||
506 | ||||
507 | #define YYABORTgoto yyabort goto yyabort | |||
508 | #define YYREJECTgoto yyabort goto yyabort | |||
509 | #define YYACCEPTgoto yyaccept goto yyaccept | |||
510 | #define YYERRORgoto yyerrlab goto yyerrlab | |||
511 | int | |||
512 | yyparse(void) | |||
513 | { | |||
514 | int yym, yyn, yystate; | |||
515 | #if YYDEBUG0 | |||
516 | const char *yys; | |||
517 | ||||
518 | if ((yys = getenv("YYDEBUG"))) | |||
519 | { | |||
520 | yyn = *yys; | |||
521 | if (yyn >= '0' && yyn <= '9') | |||
522 | yydebug = yyn - '0'; | |||
523 | } | |||
524 | #endif /* YYDEBUG */ | |||
525 | ||||
526 | yynerrs = 0; | |||
527 | yyerrflag = 0; | |||
528 | yychar = (-1); | |||
529 | ||||
530 | if (yyss == NULL((void *)0) && yygrowstack()) goto yyoverflow; | |||
| ||||
531 | yyssp = yyss; | |||
532 | yyvsp = yyvs; | |||
533 | *yyssp = yystate = 0; | |||
| ||||
534 | ||||
535 | yyloop: | |||
536 | if ((yyn = yydefred[yystate]) != 0) goto yyreduce; | |||
537 | if (yychar < 0) | |||
538 | { | |||
539 | if ((yychar = yylex()) < 0) yychar = 0; | |||
540 | #if YYDEBUG0 | |||
541 | if (yydebug) | |||
542 | { | |||
543 | yys = 0; | |||
544 | if (yychar <= YYMAXTOKEN278) yys = yyname[yychar]; | |||
545 | if (!yys) yys = "illegal-symbol"; | |||
546 | printf("%sdebug: state %d, reading %d (%s)\n", | |||
547 | YYPREFIX"yy", yystate, yychar, yys); | |||
548 | } | |||
549 | #endif | |||
550 | } | |||
551 | if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && | |||
552 | yyn <= YYTABLESIZE284 && yycheck[yyn] == yychar) | |||
553 | { | |||
554 | #if YYDEBUG0 | |||
555 | if (yydebug) | |||
556 | printf("%sdebug: state %d, shifting to state %d\n", | |||
557 | YYPREFIX"yy", yystate, yytable[yyn]); | |||
558 | #endif | |||
559 | if (yyssp >= yysslim && yygrowstack()) | |||
560 | { | |||
561 | goto yyoverflow; | |||
562 | } | |||
563 | *++yyssp = yystate = yytable[yyn]; | |||
564 | *++yyvsp = yylval; | |||
565 | yychar = (-1); | |||
566 | if (yyerrflag > 0) --yyerrflag; | |||
567 | goto yyloop; | |||
568 | } | |||
569 | if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && | |||
570 | yyn <= YYTABLESIZE284 && yycheck[yyn] == yychar) | |||
571 | { | |||
572 | yyn = yytable[yyn]; | |||
573 | goto yyreduce; | |||
574 | } | |||
575 | if (yyerrflag) goto yyinrecovery; | |||
576 | #if defined(__GNUC__4) | |||
577 | goto yynewerror; | |||
578 | #endif | |||
579 | yynewerror: | |||
580 | yyerror("syntax error"); | |||
581 | #if defined(__GNUC__4) | |||
582 | goto yyerrlab; | |||
583 | #endif | |||
584 | yyerrlab: | |||
585 | ++yynerrs; | |||
586 | yyinrecovery: | |||
587 | if (yyerrflag < 3) | |||
588 | { | |||
589 | yyerrflag = 3; | |||
590 | for (;;) | |||
591 | { | |||
592 | if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE256) >= 0 && | |||
593 | yyn <= YYTABLESIZE284 && yycheck[yyn] == YYERRCODE256) | |||
594 | { | |||
595 | #if YYDEBUG0 | |||
596 | if (yydebug) | |||
597 | printf("%sdebug: state %d, error recovery shifting\ | |||
598 | to state %d\n", YYPREFIX"yy", *yyssp, yytable[yyn]); | |||
599 | #endif | |||
600 | if (yyssp >= yysslim && yygrowstack()) | |||
601 | { | |||
602 | goto yyoverflow; | |||
603 | } | |||
604 | *++yyssp = yystate = yytable[yyn]; | |||
605 | *++yyvsp = yylval; | |||
606 | goto yyloop; | |||
607 | } | |||
608 | else | |||
609 | { | |||
610 | #if YYDEBUG0 | |||
611 | if (yydebug) | |||
612 | printf("%sdebug: error recovery discarding state %d\n", | |||
613 | YYPREFIX"yy", *yyssp); | |||
614 | #endif | |||
615 | if (yyssp <= yyss) goto yyabort; | |||
616 | --yyssp; | |||
617 | --yyvsp; | |||
618 | } | |||
619 | } | |||
620 | } | |||
621 | else | |||
622 | { | |||
623 | if (yychar == 0) goto yyabort; | |||
624 | #if YYDEBUG0 | |||
625 | if (yydebug) | |||
626 | { | |||
627 | yys = 0; | |||
628 | if (yychar <= YYMAXTOKEN278) yys = yyname[yychar]; | |||
629 | if (!yys) yys = "illegal-symbol"; | |||
630 | printf("%sdebug: state %d, error recovery discards token %d (%s)\n", | |||
631 | YYPREFIX"yy", yystate, yychar, yys); | |||
632 | } | |||
633 | #endif | |||
634 | yychar = (-1); | |||
635 | goto yyloop; | |||
636 | } | |||
637 | yyreduce: | |||
638 | #if YYDEBUG0 | |||
639 | if (yydebug) | |||
640 | printf("%sdebug: state %d, reducing by rule %d (%s)\n", | |||
641 | YYPREFIX"yy", yystate, yyn, yyrule[yyn]); | |||
642 | #endif | |||
643 | yym = yylen[yyn]; | |||
644 | if (yym) | |||
645 | yyval = yyvsp[1-yym]; | |||
646 | else | |||
647 | memset(&yyval, 0, sizeof yyval); | |||
648 | switch (yyn) | |||
649 | { | |||
650 | case 3: | |||
651 | #line 81 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
652 | { yyval.val = AF_UNSPEC0; } | |||
653 | break; | |||
654 | case 4: | |||
655 | #line 82 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
656 | { yyval.val = AF_INET2; } | |||
657 | break; | |||
658 | case 5: | |||
659 | #line 83 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
660 | { yyval.val = AF_INET624; } | |||
661 | break; | |||
662 | case 6: | |||
663 | #line 86 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
664 | { yyval.val = SASYNCD_DEFAULT_PORT500; } | |||
665 | break; | |||
666 | case 7: | |||
667 | #line 87 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
668 | { yyval.val = yyvsp[0].val; } | |||
669 | break; | |||
670 | case 8: | |||
671 | #line 90 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
672 | { yyval.val = MASTER; } | |||
673 | break; | |||
674 | case 9: | |||
675 | #line 91 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
676 | { yyval.val = SLAVE; } | |||
677 | break; | |||
678 | case 10: | |||
679 | #line 95 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
680 | { | |||
681 | cfgstate.flags |= SKIP_LOCAL_SAS0x0004; | |||
682 | log_msg(2, "config: not syncing SA to peers"); | |||
683 | } | |||
684 | break; | |||
685 | case 11: | |||
686 | #line 100 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
687 | { | |||
688 | const char *m[] = CARPSTATES{ "INIT", "SLAVE", "MASTER", "FAIL" }; | |||
689 | cfgstate.lockedstate = yyvsp[0].val; | |||
690 | log_msg(2, "config: mode set to %s", m[yyvsp[0].val]); | |||
691 | } | |||
692 | break; | |||
693 | case 12: | |||
694 | #line 107 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
695 | { yyval.val = FM_STARTUP0x0000; } | |||
696 | break; | |||
697 | case 13: | |||
698 | #line 108 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
699 | { yyval.val = FM_NEVER0x0001; } | |||
700 | break; | |||
701 | case 14: | |||
702 | #line 109 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
703 | { yyval.val = FM_SYNC0x0002; } | |||
704 | break; | |||
705 | case 15: | |||
706 | #line 113 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
707 | { | |||
708 | if (cfgstate.sharedkey) | |||
709 | free(cfgstate.sharedkey); | |||
710 | cfgstate.sharedkey = yyvsp[0].string; | |||
711 | cfgstate.sharedkey_len = strlen(yyvsp[0].string) * 8; | |||
712 | log_msg(2, "config: shared ascii key"); | |||
713 | } | |||
714 | break; | |||
715 | case 16: | |||
716 | #line 121 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
717 | { | |||
718 | if (cfgstate.sharedkey) | |||
719 | free(cfgstate.sharedkey); | |||
720 | cfgstate.sharedkey = yyvsp[0].hex.data; | |||
721 | cfgstate.sharedkey_len = yyvsp[0].hex.len * 8; | |||
722 | log_msg(2, "config: %d byte shared hex key", yyvsp[0].hex.len); | |||
723 | } | |||
724 | break; | |||
725 | case 17: | |||
726 | #line 130 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
727 | { | |||
728 | /* Compare strings to avoid keywords for daemons */ | |||
729 | if (strcmp("isakmpd", yyvsp[0].string) == 0) | |||
730 | yyval.val = CTL_ISAKMPD0x0008; | |||
731 | else if (strcmp("iked", yyvsp[0].string) == 0) | |||
732 | yyval.val = CTL_IKED0x0010; | |||
733 | else if (strcmp("all", yyvsp[0].string) == 0) | |||
734 | yyval.val = CTL_MASK0x0018; | |||
735 | else if (strcmp("none", yyvsp[0].string) == 0) | |||
736 | yyval.val = CTL_NONE0x0000; | |||
737 | else { | |||
738 | log_err("config: invalid control mode"); | |||
739 | free(yyvsp[0].string); | |||
740 | YYERRORgoto yyerrlab; | |||
741 | } | |||
742 | log_msg(2, "config: control mode set to %s", yyvsp[0].string); | |||
743 | free(yyvsp[0].string); | |||
744 | } | |||
745 | break; | |||
746 | case 18: | |||
747 | #line 151 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
748 | { | |||
749 | if (cfgstate.carp_ifname) | |||
750 | free(cfgstate.carp_ifname); | |||
751 | cfgstate.carp_ifname = yyvsp[0].string; | |||
752 | log_msg(2, "config: interface %s", | |||
753 | cfgstate.carp_ifname); | |||
754 | } | |||
755 | break; | |||
756 | case 19: | |||
757 | #line 159 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
758 | { | |||
759 | if (cfgstate.carp_ifgroup) | |||
760 | free(cfgstate.carp_ifgroup); | |||
761 | cfgstate.carp_ifgroup = yyvsp[0].string; | |||
762 | log_msg(2, "config: group %s", | |||
763 | cfgstate.carp_ifgroup); | |||
764 | } | |||
765 | break; | |||
766 | case 20: | |||
767 | #line 167 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
768 | { | |||
769 | const char *fm[] = { "STARTUP", "NEVER", "SYNC" }; | |||
770 | cfgstate.flags |= yyvsp[0].val; | |||
771 | log_msg(2, "config: flush mode set to %s", fm[yyvsp[0].val]); | |||
772 | } | |||
773 | break; | |||
774 | case 21: | |||
775 | #line 173 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
776 | { | |||
777 | struct syncpeer *peer; | |||
778 | int duplicate = 0; | |||
779 | ||||
780 | for (peer = LIST_FIRST(&cfgstate.peerlist)((&cfgstate.peerlist)->lh_first); peer; | |||
781 | peer = LIST_NEXT(peer, link)((peer)->link.le_next)) | |||
782 | if (strcmp(yyvsp[0].string, peer->name) == 0) { | |||
783 | duplicate++; | |||
784 | break; | |||
785 | } | |||
786 | if (duplicate) | |||
787 | free(yyvsp[0].string); | |||
788 | else { | |||
789 | peer = calloc(1, sizeof *peer); | |||
790 | if (!peer) { | |||
791 | log_err("config: calloc(1, %lu) " | |||
792 | "failed", sizeof *peer); | |||
793 | free(yyvsp[0].string); | |||
794 | YYERRORgoto yyerrlab; | |||
795 | } | |||
796 | peer->name = yyvsp[0].string; | |||
797 | } | |||
798 | LIST_INSERT_HEAD(&cfgstate.peerlist, peer, link)do { if (((peer)->link.le_next = (&cfgstate.peerlist)-> lh_first) != ((void *)0)) (&cfgstate.peerlist)->lh_first ->link.le_prev = &(peer)->link.le_next; (&cfgstate .peerlist)->lh_first = (peer); (peer)->link.le_prev = & (&cfgstate.peerlist)->lh_first; } while (0); | |||
799 | cfgstate.peercnt++; | |||
800 | log_msg(2, "config: add peer %s", peer->name); | |||
801 | } | |||
802 | break; | |||
803 | case 22: | |||
804 | #line 200 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
805 | { | |||
806 | char pstr[20]; | |||
807 | ||||
808 | if (cfgstate.listen_on) | |||
809 | free(cfgstate.listen_on); | |||
810 | cfgstate.listen_on = yyvsp[-2].string; | |||
811 | cfgstate.listen_family = yyvsp[-1].val; | |||
812 | cfgstate.listen_port = yyvsp[0].val; | |||
813 | if (yyvsp[0].val < 1 || yyvsp[0].val > IPPORT_HILASTAUTO65535) { | |||
814 | cfgstate.listen_port = SASYNCD_DEFAULT_PORT500; | |||
815 | log_msg(0, "config: bad port, listen-port " | |||
816 | "reset to %u", SASYNCD_DEFAULT_PORT500); | |||
817 | } | |||
818 | if (yyvsp[0].val != SASYNCD_DEFAULT_PORT500) | |||
819 | snprintf(pstr, sizeof pstr, "port %d",yyvsp[0].val); | |||
820 | log_msg(2, "config: listen on %s %s%s", | |||
821 | cfgstate.listen_on, yyvsp[-1].val == AF_INET624 ? "(IPv6) " : | |||
822 | (yyvsp[-1].val == AF_INET2 ? "(IPv4) " : ""), | |||
823 | yyvsp[0].val != SASYNCD_DEFAULT_PORT500 ? pstr : ""); | |||
824 | } | |||
825 | break; | |||
826 | case 24: | |||
827 | #line 222 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
828 | { | |||
829 | int bits; | |||
830 | ||||
831 | bits = cfgstate.sharedkey_len; | |||
832 | if (bits != 128 && bits != 192 && bits != 256) { | |||
833 | log_err("config: bad shared key length %d, " | |||
834 | "should be 128, 192 or 256 bits\n", bits); | |||
835 | YYERRORgoto yyerrlab; | |||
836 | } | |||
837 | log_msg(2, "config: shared key set"); | |||
838 | } | |||
839 | break; | |||
840 | case 25: | |||
841 | #line 234 "/usr/src/usr.sbin/sasyncd/conf.y" | |||
842 | { | |||
843 | cfgstate.flags &= ~CTL_MASK0x0018; | |||
844 | cfgstate.flags |= yyvsp[0].val; | |||
845 | } | |||
846 | break; | |||
847 | #line 840 "conf.c" | |||
848 | } | |||
849 | yyssp -= yym; | |||
850 | yystate = *yyssp; | |||
851 | yyvsp -= yym; | |||
852 | yym = yylhs[yyn]; | |||
853 | if (yystate == 0 && yym == 0) | |||
854 | { | |||
855 | #if YYDEBUG0 | |||
856 | if (yydebug) | |||
857 | printf("%sdebug: after reduction, shifting from state 0 to\ | |||
858 | state %d\n", YYPREFIX"yy", YYFINAL1); | |||
859 | #endif | |||
860 | yystate = YYFINAL1; | |||
861 | *++yyssp = YYFINAL1; | |||
862 | *++yyvsp = yyval; | |||
863 | if (yychar < 0) | |||
864 | { | |||
865 | if ((yychar = yylex()) < 0) yychar = 0; | |||
866 | #if YYDEBUG0 | |||
867 | if (yydebug) | |||
868 | { | |||
869 | yys = 0; | |||
870 | if (yychar <= YYMAXTOKEN278) yys = yyname[yychar]; | |||
871 | if (!yys) yys = "illegal-symbol"; | |||
872 | printf("%sdebug: state %d, reading %d (%s)\n", | |||
873 | YYPREFIX"yy", YYFINAL1, yychar, yys); | |||
874 | } | |||
875 | #endif | |||
876 | } | |||
877 | if (yychar == 0) goto yyaccept; | |||
878 | goto yyloop; | |||
879 | } | |||
880 | if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && | |||
881 | yyn <= YYTABLESIZE284 && yycheck[yyn] == yystate) | |||
882 | yystate = yytable[yyn]; | |||
883 | else | |||
884 | yystate = yydgoto[yym]; | |||
885 | #if YYDEBUG0 | |||
886 | if (yydebug) | |||
887 | printf("%sdebug: after reduction, shifting from state %d \ | |||
888 | to state %d\n", YYPREFIX"yy", *yyssp, yystate); | |||
889 | #endif | |||
890 | if (yyssp >= yysslim && yygrowstack()) | |||
891 | { | |||
892 | goto yyoverflow; | |||
893 | } | |||
894 | *++yyssp = yystate; | |||
895 | *++yyvsp = yyval; | |||
896 | goto yyloop; | |||
897 | yyoverflow: | |||
898 | yyerror("yacc stack overflow"); | |||
899 | yyabort: | |||
900 | if (yyss) | |||
901 | free(yyss); | |||
902 | if (yyvs) | |||
903 | free(yyvs); | |||
904 | yyss = yyssp = NULL((void *)0); | |||
905 | yyvs = yyvsp = NULL((void *)0); | |||
906 | yystacksize = 0; | |||
907 | return (1); | |||
908 | yyaccept: | |||
909 | if (yyss) | |||
910 | free(yyss); | |||
911 | if (yyvs) | |||
912 | free(yyvs); | |||
913 | yyss = yyssp = NULL((void *)0); | |||
914 | yyvs = yyvsp = NULL((void *)0); | |||
915 | yystacksize = 0; | |||
916 | return (0); | |||
917 | } |