]> git.ipfire.org Git - people/ms/dnsmasq.git/commitdiff
Check IPv4-mapped IPv6 addresses with --stop-rebind.
authorSimon Kelley <simon@thekelleys.org.uk>
Fri, 8 May 2015 19:25:51 +0000 (20:25 +0100)
committerSimon Kelley <simon@thekelleys.org.uk>
Fri, 8 May 2015 19:25:51 +0000 (20:25 +0100)
CHANGELOG
src/rfc1035.c

index d8fc57a418bb8e0be4e8496d0d9fb91245f9655a..94a521f996e20755f449fc4c95dbed68beae92d1 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -115,6 +115,9 @@ version 2.73
            header to 1280 bytes. If it then answers, make that
            change permanent.
 
+           Check IPv4-mapped IPv6 addresses when --stop-rebind
+           is active. Thanks to Jordan Milne for spotting this.
+
        
 version 2.72
             Add ra-advrouter mode, for RFC-3775 mobile IPv6 support.
index 8b1709dd3495c7ded6fdf34da7651f9f88a62fa6..5e3f566fdbc522f60f067880c70788b18f3b2523 100644 (file)
@@ -1117,10 +1117,23 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t
                      memcpy(&addr, p1, addrlen);
                      
                      /* check for returned address in private space */
-                     if (check_rebind &&
-                         (flags & F_IPV4) &&
-                         private_net(addr.addr.addr4, !option_bool(OPT_LOCAL_REBIND)))
-                       return 1;
+                     if (check_rebind)
+                       {
+                         if ((flags & F_IPV4) &&
+                             private_net(addr.addr.addr4, !option_bool(OPT_LOCAL_REBIND)))
+                           return 1;
+                         
+#ifdef HAVE_IPV6
+                         if ((flags & F_IPV6) &&
+                             IN6_IS_ADDR_V4MAPPED(&addr.addr.addr6))
+                           {
+                             struct in_addr v4;
+                             v4.s_addr = ((const uint32_t *) (&addr.addr.addr6))[3];
+                             if (private_net(v4, !option_bool(OPT_LOCAL_REBIND)))
+                               return 1;
+                           }
+#endif
+                       }
                      
 #ifdef HAVE_IPSET
                      if (ipsets && (flags & (F_IPV4 | F_IPV6)))