Fix use of uninitialized values, as gilles-chanteperdrix mentionned in https://github.com/gilles-chanteperdrix/uvrrpd/commit/adf9352
This commit is contained in:
parent
f62f405f58
commit
4737ff78cc
12
common.h
12
common.h
|
@ -143,7 +143,7 @@ static inline int split_ip_netmask(int family,
|
||||||
char *tmp;
|
char *tmp;
|
||||||
unsigned long ul;
|
unsigned long ul;
|
||||||
|
|
||||||
int netmask_length;
|
int netmask_length, err;
|
||||||
|
|
||||||
/* IPv4 */
|
/* IPv4 */
|
||||||
if (family == AF_INET)
|
if (family == AF_INET)
|
||||||
|
@ -159,10 +159,16 @@ static inline int split_ip_netmask(int family,
|
||||||
if (tmp != NULL) {
|
if (tmp != NULL) {
|
||||||
*tmp = '\0';
|
*tmp = '\0';
|
||||||
++tmp;
|
++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");
|
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)
|
if (netmask != NULL)
|
||||||
*netmask = (uint8_t) ul;
|
*netmask = (uint8_t) ul;
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,7 @@ static void vrrp_usage(void)
|
||||||
int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
|
int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
|
||||||
char *argv[])
|
char *argv[])
|
||||||
{
|
{
|
||||||
int optc;
|
int optc, err;
|
||||||
unsigned long opt; /* strtoul */
|
unsigned long opt; /* strtoul */
|
||||||
|
|
||||||
static struct option const opts[] = {
|
static struct option const opts[] = {
|
||||||
|
@ -97,12 +97,20 @@ int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
|
||||||
|
|
||||||
/* vrid */
|
/* vrid */
|
||||||
case 'v':
|
case 'v':
|
||||||
if ((mystrtoul(&opt, optarg, VRID_MAX) == -ERANGE)
|
err = mystrtoul(&opt, optarg, VRID_MAX);
|
||||||
|| (opt == 0)) {
|
if (err == -ERANGE || (err == 0 && opt == 0)) {
|
||||||
fprintf(stderr, "1 < vrid < 255\n");
|
fprintf(stderr, "1 < vrid < 255\n");
|
||||||
vrrp_usage();
|
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;
|
vrrp->vrid = vnet->vrid = (uint8_t) opt;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -117,20 +125,38 @@ int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
|
||||||
|
|
||||||
/* priority */
|
/* priority */
|
||||||
case 'p':
|
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");
|
fprintf(stderr, "0 < priority < 255\n");
|
||||||
vrrp_usage();
|
vrrp_usage();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (err == -EINVAL) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error parsing \"%s\" as a number\n",
|
||||||
|
optarg);
|
||||||
|
vrrp_usage();
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
vrrp->priority = (uint8_t) opt;
|
vrrp->priority = (uint8_t) opt;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* delay */
|
/* delay */
|
||||||
case 't':
|
case 't':
|
||||||
if (mystrtoul(&opt, optarg, ADVINT_MAX) == -ERANGE) {
|
err = mystrtoul(&opt, optarg, ADVINT_MAX);
|
||||||
|
if (err == -ERANGE) {
|
||||||
vrrp_usage();
|
vrrp_usage();
|
||||||
return -1;
|
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;
|
vrrp->adv_int = (uint16_t) opt;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -150,12 +176,20 @@ int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
|
||||||
|
|
||||||
/* RFC - version */
|
/* RFC - version */
|
||||||
case 'r':
|
case 'r':
|
||||||
if ((mystrtoul(&opt, optarg, RFC5798) == -ERANGE)
|
err = mystrtoul(&opt, optarg, RFC5798);
|
||||||
|| (opt < RFC3768)) {
|
if (err == -ERANGE || (err == 0 && opt < RFC3768)) {
|
||||||
fprintf(stderr, "Version 2 or 3 : %ld\n", opt);
|
fprintf(stderr, "Version 2 or 3 : %s\n", optarg);
|
||||||
vrrp_usage();
|
vrrp_usage();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (err == -EINVAL) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error parsing \"%s\" as a number\n",
|
||||||
|
optarg);
|
||||||
|
vrrp_usage();
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
vrrp->version = (uint8_t) opt;
|
vrrp->version = (uint8_t) opt;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue