mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 18:28:25 +00:00
Fix --add-subnet when returning empty or default subnet.
This commit is contained in:
26
src/edns0.c
26
src/edns0.c
@@ -281,8 +281,11 @@ static size_t calc_subnet_opt(struct subnet_opt *opt, union mysockaddr *source)
|
|||||||
void *addrp;
|
void *addrp;
|
||||||
int sa_family = source->sa.sa_family;
|
int sa_family = source->sa.sa_family;
|
||||||
|
|
||||||
|
opt->source_netmask = 0;
|
||||||
|
opt->scope_netmask = 0;
|
||||||
|
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
if (source->sa.sa_family == AF_INET6)
|
if (source->sa.sa_family == AF_INET6 && daemon->add_subnet6)
|
||||||
{
|
{
|
||||||
opt->source_netmask = daemon->add_subnet6->mask;
|
opt->source_netmask = daemon->add_subnet6->mask;
|
||||||
if (daemon->add_subnet6->addr_used)
|
if (daemon->add_subnet6->addr_used)
|
||||||
@@ -293,8 +296,9 @@ static size_t calc_subnet_opt(struct subnet_opt *opt, union mysockaddr *source)
|
|||||||
else
|
else
|
||||||
addrp = &source->in6.sin6_addr;
|
addrp = &source->in6.sin6_addr;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (source->sa.sa_family == AF_INET && daemon->add_subnet4)
|
||||||
{
|
{
|
||||||
opt->source_netmask = daemon->add_subnet4->mask;
|
opt->source_netmask = daemon->add_subnet4->mask;
|
||||||
if (daemon->add_subnet4->addr_used)
|
if (daemon->add_subnet4->addr_used)
|
||||||
@@ -302,26 +306,26 @@ static size_t calc_subnet_opt(struct subnet_opt *opt, union mysockaddr *source)
|
|||||||
sa_family = daemon->add_subnet4->addr.sa.sa_family;
|
sa_family = daemon->add_subnet4->addr.sa.sa_family;
|
||||||
addrp = get_addrp(&daemon->add_subnet4->addr, sa_family);
|
addrp = get_addrp(&daemon->add_subnet4->addr, sa_family);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
addrp = &source->in.sin_addr;
|
addrp = &source->in.sin_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
opt->scope_netmask = 0;
|
#ifdef HAVE_IPV6
|
||||||
|
opt->family = htons(sa_family == AF_INET6 ? 2 : 1);
|
||||||
|
#else
|
||||||
|
opt->family = htons(1);
|
||||||
|
#endif
|
||||||
|
|
||||||
len = 0;
|
len = 0;
|
||||||
|
|
||||||
if (opt->source_netmask != 0)
|
if (opt->source_netmask != 0)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IPV6
|
|
||||||
opt->family = htons(sa_family == AF_INET6 ? 2 : 1);
|
|
||||||
#else
|
|
||||||
opt->family = htons(1);
|
|
||||||
#endif
|
|
||||||
len = ((opt->source_netmask - 1) >> 3) + 1;
|
len = ((opt->source_netmask - 1) >> 3) + 1;
|
||||||
memcpy(opt->addr, addrp, len);
|
memcpy(opt->addr, addrp, len);
|
||||||
if (opt->source_netmask & 7)
|
if (opt->source_netmask & 7)
|
||||||
opt->addr[len-1] &= 0xff << (8 - (opt->source_netmask & 7));
|
opt->addr[len-1] &= 0xff << (8 - (opt->source_netmask & 7));
|
||||||
}
|
}
|
||||||
|
|
||||||
return len + 4;
|
return len + 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
src/option.c
13
src/option.c
@@ -1647,12 +1647,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
|||||||
|
|
||||||
daemon->add_subnet4 = new;
|
daemon->add_subnet4 = new;
|
||||||
|
|
||||||
new = opt_malloc(sizeof(struct mysubnet));
|
|
||||||
if (comma)
|
if (comma)
|
||||||
{
|
{
|
||||||
if ((end = split_chr(comma, '/')))
|
new = opt_malloc(sizeof(struct mysubnet));
|
||||||
{
|
if ((end = split_chr(comma, '/')))
|
||||||
/* has subnet+len */
|
{
|
||||||
|
/* has subnet+len */
|
||||||
err = parse_mysockaddr(comma, &new->addr);
|
err = parse_mysockaddr(comma, &new->addr);
|
||||||
if (err)
|
if (err)
|
||||||
ret_err(err);
|
ret_err(err);
|
||||||
@@ -1665,8 +1665,9 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
|||||||
if (!atoi_check(comma, &new->mask))
|
if (!atoi_check(comma, &new->mask))
|
||||||
ret_err(gen_err);
|
ret_err(gen_err);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
daemon->add_subnet6 = new;
|
daemon->add_subnet6 = new;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user