net: Don't register link local addresses with DNS
authorKai Blin <kai@samba.org>
Sun, 25 Sep 2011 01:18:14 +0000 (18:18 -0700)
committerKai Blin <kai@samba.org>
Sun, 25 Sep 2011 04:46:06 +0000 (21:46 -0700)
lib/util/util_net.c
lib/util/util_net.h
source3/utils/net_dns.c

index 23d25acab963ab1985d424942e81405cfadc93af..139c9d42bcaa51c0a4938bc07b58f71bca7d8c1d 100644 (file)
@@ -432,6 +432,29 @@ void zero_ip_v4(struct in_addr *ip)
        ZERO_STRUCTP(ip);
 }
 
+bool is_linklocal_addr(const struct sockaddr_storage *pss)
+{
+#ifdef HAVE_IPV6
+       if (pss->ss_family == AF_INET6) {
+               const struct in6_addr *pin6 =
+                       &((const struct sockaddr_in6 *)pss)->sin6_addr;
+               return IN6_IS_ADDR_LINKLOCAL(pin6);
+       }
+#endif
+       if (pss->ss_family == AF_INET) {
+               const struct in_addr *pin =
+                       &((const struct sockaddr_in *)pss)->sin_addr;
+               struct in_addr ll_addr;
+               struct in_addr mask_addr;
+
+               /* 169.254.0.0/16, is link local, see RFC 3927 */
+               ll_addr.s_addr = 0xa9fe0000;
+               mask_addr.s_addr = 0xffff0000;
+               return same_net_v4(*pin, ll_addr, mask_addr);
+       }
+       return false;
+}
+
 /**
  * Convert an IPv4 struct in_addr to a struct sockaddr_storage.
  */
index fc2776a32b1f8b93dd181130bc595f918891717b..215a6574d43d1300be5003d344abe32650c84513 100644 (file)
@@ -74,6 +74,7 @@ bool is_loopback_ip_v4(struct in_addr ip);
 bool is_loopback_addr(const struct sockaddr *pss);
 bool is_zero_addr(const struct sockaddr_storage *pss);
 void zero_ip_v4(struct in_addr *ip);
+bool is_linklocal_addr(const struct sockaddr_storage *pss);
 /**
  Interpret an internet address or name into an IP address in 4 byte form.
 **/
index 5fbdc0a70f35632af39117189149bdd0e8256e74..f146f29bcd41b7b1fc4fe9bfab362493fbae9e0f 100644 (file)
@@ -170,6 +170,11 @@ int get_my_ip_address( struct sockaddr_storage **pp_ss )
                        continue;
                }
 
+               /* Don't register link-local addresses */
+               if (is_linklocal_addr(nic_sa_storage)) {
+                       continue;
+               }
+
                memcpy(&list[count++], nic_sa_storage, sizeof(struct sockaddr_storage));
        }
        *pp_ss = list;