Bug Summary

File:src/usr.sbin/sasyncd/obj/conf.c
Warning:line 563, column 18
Use of zero-allocated memory

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name conf.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/usr.sbin/sasyncd/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/usr.sbin/sasyncd -I /usr/src/usr.sbin/sasyncd/../../sbin/iked -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/usr.sbin/sasyncd/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c conf.c
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. */
28struct cfgstate cfgstate;
29
30/* Local variables */
31int conflen = 0;
32char *confbuf, *confptr;
33
34int yyparse(void);
35int yylex(void);
36void yyerror(const char *);
37unsigned char x2i(unsigned char *);
38#line 57 "/usr/src/usr.sbin/sasyncd/conf.y"
39#ifndef YYSTYPE_DEFINED
40#define YYSTYPE_DEFINED
41typedef 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
74const 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};
80const 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};
86const 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};
93const short yydgoto[] =
94 { 1,
95 32, 34, 14, 25, 28, 10, 15, 21,
96};
97const 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,};
103const 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,};
109const short yygindex[] =
110 { 0,
111 0, 0, 0, 0, 0, 0, 0, 0,
112};
113#define YYTABLESIZE284 284
114const 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};
146const 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
184const 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,
1870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1880,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1890,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1910,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1920,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};
197const 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 */
239int yydebug;
240int yynerrs;
241int yyerrflag;
242int yychar;
243short *yyssp;
244YYSTYPE *yyvsp;
245YYSTYPE yyval;
246YYSTYPE yylval;
247short *yyss;
248short *yysslim;
249YYSTYPE *yyvs;
250unsigned int yystacksize;
251int yyparse(void);
252#line 241 "/usr/src/usr.sbin/sasyncd/conf.y"
253/* Program */
254
255struct keyword {
256 char *name;
257 int value;
258};
259
260static int
261match_cmp(const void *a, const void *b)
262{
263 return strcmp(a, ((const struct keyword *)b)->name);
264}
265
266static int
267match(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
298int
299yylex(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
359int
360conf_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
441unsigned char
442x2i(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
453void
454yyerror(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 */
460static int yygrowstack(void)
461{
462 unsigned int newsize;
463 long sslen;
464 short *newss;
465 YYSTYPE *newvs;
466
467 if ((newsize = yystacksize) == 0)
22
Assuming the condition is false
23
Taking false branch
468 newsize = YYINITSTACKSIZE200;
469 else if (newsize >= YYMAXDEPTH10000)
24
Assuming 'newsize' is < YYMAXDEPTH
25
Taking false branch
470 return -1;
471 else if ((newsize *= 2) > YYMAXDEPTH10000)
26
Assuming the condition is false
27
Taking false branch
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)
28
Assuming 'newsize' is 0
480 goto bail;
481 newss = (short *)realloc(yyss, newsize * sizeof *newss);
482 if (newss == NULL((void *)0))
29
Assuming 'newss' is not equal to NULL
30
Taking false branch
483 goto bail;
484 yyss = newss;
485 yyssp = newss + sslen;
486 if (newsize
30.1
'newsize' is 0
&& YY_SIZE_MAX0xffffffffU / newsize < sizeof *newvs)
487 goto bail;
488 newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs);
489 if (newvs == NULL((void *)0))
31
Assuming 'newvs' is not equal to NULL
32
Taking false branch
490 goto bail;
491 yyvs = newvs;
492 yyvsp = newvs + sslen;
493 yystacksize = newsize;
494 yysslim = yyss + newsize - 1;
495 return 0;
496bail:
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
511int
512yyparse(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;
1
Assuming 'yyss' is not equal to NULL
531 yyssp = yyss;
532 yyvsp = yyvs;
533 *yyssp = yystate = 0;
534
535yyloop:
536 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
2
Taking true branch
3
Control jumps to line 643
13
Taking false branch
537 if (yychar
13.1
'yychar' is >= 0
< 0)
14
Taking false branch
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 &&
15
Assuming 'yyn' is not equal to 0
16
Assuming the condition is true
19
Taking true branch
552 yyn <= YYTABLESIZE284 && yycheck[yyn] == yychar)
17
Assuming 'yyn' is <= YYTABLESIZE
18
Assuming the condition is true
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())
20
Assuming 'yyssp' is >= 'yysslim'
21
Calling 'yygrowstack'
33
Returning from 'yygrowstack'
34
Taking false branch
560 {
561 goto yyoverflow;
562 }
563 *++yyssp = yystate = yytable[yyn];
35
Use of zero-allocated memory
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
579yynewerror:
580 yyerror("syntax error");
581#if defined(__GNUC__4)
582 goto yyerrlab;
583#endif
584yyerrlab:
585 ++yynerrs;
586yyinrecovery:
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 }
637yyreduce:
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
3.1
'yym' is 0
)
4
Taking false branch
645 yyval = yyvsp[1-yym];
646 else
647 memset(&yyval, 0, sizeof yyval);
648 switch (yyn)
5
'Default' branch taken. Execution continues on line 849
649 {
650case 3:
651#line 81 "/usr/src/usr.sbin/sasyncd/conf.y"
652{ yyval.val = AF_UNSPEC0; }
653break;
654case 4:
655#line 82 "/usr/src/usr.sbin/sasyncd/conf.y"
656{ yyval.val = AF_INET2; }
657break;
658case 5:
659#line 83 "/usr/src/usr.sbin/sasyncd/conf.y"
660{ yyval.val = AF_INET624; }
661break;
662case 6:
663#line 86 "/usr/src/usr.sbin/sasyncd/conf.y"
664{ yyval.val = SASYNCD_DEFAULT_PORT500; }
665break;
666case 7:
667#line 87 "/usr/src/usr.sbin/sasyncd/conf.y"
668{ yyval.val = yyvsp[0].val; }
669break;
670case 8:
671#line 90 "/usr/src/usr.sbin/sasyncd/conf.y"
672{ yyval.val = MASTER; }
673break;
674case 9:
675#line 91 "/usr/src/usr.sbin/sasyncd/conf.y"
676{ yyval.val = SLAVE; }
677break;
678case 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 }
684break;
685case 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 }
692break;
693case 12:
694#line 107 "/usr/src/usr.sbin/sasyncd/conf.y"
695{ yyval.val = FM_STARTUP0x0000; }
696break;
697case 13:
698#line 108 "/usr/src/usr.sbin/sasyncd/conf.y"
699{ yyval.val = FM_NEVER0x0001; }
700break;
701case 14:
702#line 109 "/usr/src/usr.sbin/sasyncd/conf.y"
703{ yyval.val = FM_SYNC0x0002; }
704break;
705case 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 }
714break;
715case 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 }
724break;
725case 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 }
745break;
746case 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 }
755break;
756case 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 }
765break;
766case 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 }
773break;
774case 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 }
802break;
803case 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 }
825break;
826case 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 }
839break;
840case 25:
841#line 234 "/usr/src/usr.sbin/sasyncd/conf.y"
842{
843 cfgstate.flags &= ~CTL_MASK0x0018;
844 cfgstate.flags |= yyvsp[0].val;
845 }
846break;
847#line 840 "conf.c"
848 }
849 yyssp -= yym;
850 yystate = *yyssp;
851 yyvsp -= yym;
852 yym = yylhs[yyn];
853 if (yystate
5.1
'yystate' is equal to 0
== 0 && yym
5.2
'yym' is equal to 0
== 0)
6
Taking true branch
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
6.1
'yychar' is < 0
< 0)
7
Taking true branch
864 {
865 if ((yychar = yylex()) < 0) yychar = 0;
8
Assuming the condition is false
9
Taking false branch
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;
10
Assuming 'yychar' is not equal to 0
11
Taking false branch
878 goto yyloop;
12
Control jumps to line 536
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 \
888to 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;
897yyoverflow:
898 yyerror("yacc stack overflow");
899yyabort:
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);
908yyaccept:
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}