Various yacc rules for optional configuration items weren't properly
setting the empty items to NULL. As a result, the rules list ends up
with invalid contents, including invalid string pointers.
This bug doesn't occur with OpenBSD's yacc, since it memset()s yyval
upon each reduce. GNU Bison doesn't have the matching memset(), and
thus the difference in behaviors.
{
size_t cnt = 0;
- while (*arr) {
- cnt++;
- arr++;
+ if (arr) {
+ while (*arr) {
+ cnt++;
+ arr++;
+ }
}
return cnt;
}
$$.action = DENY;
} ;
-options: /* none */
- | options option {
+options: /* none */ {
+ $$.options = 0;
+ $$.envlist = NULL;
+ } | options option {
$$.options = $1.options | $2.options;
$$.envlist = $1.envlist;
if ($2.envlist) {
} ;
option: TNOPASS {
$$.options = NOPASS;
+ $$.envlist = NULL;
} | TKEEPENV {
$$.options = KEEPENV;
+ $$.envlist = NULL;
} | TKEEPENV '{' envlist '}' {
$$.options = KEEPENV;
$$.envlist = $3.envlist;
} ;
envlist: /* empty */ {
- if (!($$.envlist = calloc(1, sizeof(char *))))
- errx(1, "can't allocate envlist");
+ $$.envlist = NULL;
} | envlist TSTRING {
int nenv = arraylen($1.envlist);
if (!($$.envlist = reallocarray($1.envlist, nenv + 2,
} ;
argslist: /* empty */ {
- if (!($$.cmdargs = calloc(1, sizeof(char *))))
- errx(1, "can't allocate args");
+ $$.cmdargs = NULL;
} | argslist TSTRING {
int nargs = arraylen($1.cmdargs);
if (!($$.cmdargs = reallocarray($1.cmdargs, nargs + 2,