mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 10:18:25 +00:00
Handle v4-mapped IPv6 addresses sanely for --synth-domain.
This commit is contained in:
@@ -24,7 +24,12 @@ version 2.77
|
|||||||
Bump zone serial on reloading /etc/hosts and friends
|
Bump zone serial on reloading /etc/hosts and friends
|
||||||
when providing authoritative DNS. Thanks to Harrald
|
when providing authoritative DNS. Thanks to Harrald
|
||||||
Dunkel for spotting this.
|
Dunkel for spotting this.
|
||||||
|
|
||||||
|
Handle v4-mapped IPv6 addresses sanely in --synth-domain.
|
||||||
|
These have standard representation like ::ffff:1.2.3.4
|
||||||
|
and are now converted to names like
|
||||||
|
<prefix>--ffff-1-2-3-4.<domain>
|
||||||
|
|
||||||
|
|
||||||
version 2.76
|
version 2.76
|
||||||
Include 0.0.0.0/8 in DNS rebind checks. This range
|
Include 0.0.0.0/8 in DNS rebind checks. This range
|
||||||
|
|||||||
@@ -619,6 +619,8 @@ but IPv6 addresses may start with '::'
|
|||||||
but DNS labels may not start with '-' so in this case if no prefix is
|
but DNS labels may not start with '-' so in this case if no prefix is
|
||||||
configured a zero is added in front of the label. ::1 becomes 0--1.
|
configured a zero is added in front of the label. ::1 becomes 0--1.
|
||||||
|
|
||||||
|
V4 mapped IPv6 addresses, which have a representation like ::ffff:1.2.3.4 are handled specially, and become like 0--ffff-1-2-3-4
|
||||||
|
|
||||||
The address range can be of the form
|
The address range can be of the form
|
||||||
<ip address>,<ip address> or <ip address>/<netmask>
|
<ip address>,<ip address> or <ip address>/<netmask>
|
||||||
.TP
|
.TP
|
||||||
|
|||||||
36
src/domain.c
36
src/domain.c
@@ -77,18 +77,31 @@ int is_name_synthetic(int flags, char *name, struct all_addr *addr)
|
|||||||
|
|
||||||
*p = 0;
|
*p = 0;
|
||||||
|
|
||||||
/* swap . or : for - */
|
#ifdef HAVE_IPV6
|
||||||
for (p = tail; *p; p++)
|
if (prot == AF_INET6 && strstr(tail, "--ffff-") == tail)
|
||||||
if (*p == '-')
|
{
|
||||||
{
|
/* special hack for v4-mapped. */
|
||||||
if (prot == AF_INET)
|
memcpy(tail, "::ffff:", 7);
|
||||||
|
for (p = tail + 7; *p; p++)
|
||||||
|
if (*p == '-')
|
||||||
*p = '.';
|
*p = '.';
|
||||||
#ifdef HAVE_IPV6
|
}
|
||||||
else
|
else
|
||||||
*p = ':';
|
|
||||||
#endif
|
#endif
|
||||||
}
|
{
|
||||||
|
/* swap . or : for - */
|
||||||
|
for (p = tail; *p; p++)
|
||||||
|
if (*p == '-')
|
||||||
|
{
|
||||||
|
if (prot == AF_INET)
|
||||||
|
*p = '.';
|
||||||
|
#ifdef HAVE_IPV6
|
||||||
|
else
|
||||||
|
*p = ':';
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (hostname_isequal(c->domain, p+1) && inet_pton(prot, tail, addr))
|
if (hostname_isequal(c->domain, p+1) && inet_pton(prot, tail, addr))
|
||||||
{
|
{
|
||||||
if (prot == AF_INET)
|
if (prot == AF_INET)
|
||||||
@@ -169,8 +182,9 @@ int is_rev_synth(int flag, struct all_addr *addr, char *name)
|
|||||||
inet_ntop(AF_INET6, &addr->addr.addr6, name+1, ADDRSTRLEN);
|
inet_ntop(AF_INET6, &addr->addr.addr6, name+1, ADDRSTRLEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* V4-mapped have periods.... */
|
||||||
for (p = name; *p; p++)
|
for (p = name; *p; p++)
|
||||||
if (*p == ':')
|
if (*p == ':' || *p == '.')
|
||||||
*p = '-';
|
*p = '-';
|
||||||
|
|
||||||
strncat(name, ".", MAXDNAME);
|
strncat(name, ".", MAXDNAME);
|
||||||
|
|||||||
Reference in New Issue
Block a user