Fix use of uninitialized values, as gilles-chanteperdrix mentionned in https://github.com/gilles-chanteperdrix/uvrrpd/commit/adf9352

This commit is contained in:
Arnaud Andre 2015-12-22 09:22:14 +01:00
parent f62f405f58
commit 4737ff78cc
2 changed files with 52 additions and 12 deletions

View file

@ -143,7 +143,7 @@ static inline int split_ip_netmask(int family,
char *tmp;
unsigned long ul;
int netmask_length;
int netmask_length, err;
/* IPv4 */
if (family == AF_INET)
@ -159,10 +159,16 @@ static inline int split_ip_netmask(int family,
if (tmp != NULL) {
*tmp = '\0';
++tmp;
if (mystrtoul(&ul, tmp, netmask_length) == -ERANGE) {
err = mystrtoul(&ul, tmp, netmask_length);
if (err == -ERANGE) {
log_error("%s", "CIDR netmask out of range");
return -ERANGE;
return err;
}
if (err == -EINVAL) {
log_error("Error parsing %s as a number", tmp);
return err;
}
if (netmask != NULL)
*netmask = (uint8_t) ul;
}

View file

@ -70,7 +70,7 @@ static void vrrp_usage(void)
int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
char *argv[])
{
int optc;
int optc, err;
unsigned long opt; /* strtoul */
static struct option const opts[] = {
@ -97,12 +97,20 @@ int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
/* vrid */
case 'v':
if ((mystrtoul(&opt, optarg, VRID_MAX) == -ERANGE)
|| (opt == 0)) {
err = mystrtoul(&opt, optarg, VRID_MAX);
if (err == -ERANGE || (err == 0 && opt == 0)) {
fprintf(stderr, "1 < vrid < 255\n");
vrrp_usage();
return -1;
return err;
}
if (err == -EINVAL) {
fprintf(stderr,
"Error parsing \"%s\" as a number\n",
optarg);
vrrp_usage();
return err;
}
vrrp->vrid = vnet->vrid = (uint8_t) opt;
break;
@ -117,20 +125,38 @@ int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
/* priority */
case 'p':
if (mystrtoul(&opt, optarg, VRRP_PRIO_MAX) == -ERANGE) {
err = mystrtoul(&opt, optarg, VRRP_PRIO_MAX);
if (err == -ERANGE) {
fprintf(stderr, "0 < priority < 255\n");
vrrp_usage();
return -1;
}
if (err == -EINVAL) {
fprintf(stderr,
"Error parsing \"%s\" as a number\n",
optarg);
vrrp_usage();
return err;
}
vrrp->priority = (uint8_t) opt;
break;
/* delay */
case 't':
if (mystrtoul(&opt, optarg, ADVINT_MAX) == -ERANGE) {
err = mystrtoul(&opt, optarg, ADVINT_MAX);
if (err == -ERANGE) {
vrrp_usage();
return -1;
}
if (err == -EINVAL) {
fprintf(stderr,
"Error parsing \"%s\" as a number\n",
optarg);
vrrp_usage();
return err;
}
vrrp->adv_int = (uint16_t) opt;
break;
@ -150,12 +176,20 @@ int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
/* RFC - version */
case 'r':
if ((mystrtoul(&opt, optarg, RFC5798) == -ERANGE)
|| (opt < RFC3768)) {
fprintf(stderr, "Version 2 or 3 : %ld\n", opt);
err = mystrtoul(&opt, optarg, RFC5798);
if (err == -ERANGE || (err == 0 && opt < RFC3768)) {
fprintf(stderr, "Version 2 or 3 : %s\n", optarg);
vrrp_usage();
return -1;
}
if (err == -EINVAL) {
fprintf(stderr,
"Error parsing \"%s\" as a number\n",
optarg);
vrrp_usage();
return err;
}
vrrp->version = (uint8_t) opt;
break;