Author: hiren
Date: Wed Jan 14 23:34:00 2015
New Revision: 277202
URL: https://svnweb.freebsd.org/changeset/base/277202

Log:
  ntpd tries to bind to IPv6 interfaces in 'tentative' state and fails as IPv6 
is
  actually disabled. Fix it by making ntpd ignore such interfaces.
  
  Submitted by: ume
  Reviewed by:  bz, gnn
  MFC after:    1 week
  Differential Revision:        https://reviews.freebsd.org/D1527

Modified:
  head/contrib/ntp/ntpd/ntp_io.c

Modified: head/contrib/ntp/ntpd/ntp_io.c
==============================================================================
--- head/contrib/ntp/ntpd/ntp_io.c      Wed Jan 14 22:37:11 2015        
(r277201)
+++ head/contrib/ntp/ntpd/ntp_io.c      Wed Jan 14 23:34:00 2015        
(r277202)
@@ -1176,12 +1176,13 @@ set_wildcard_reuse(int family, int on)
 
 #ifdef INCLUDE_IPV6_SUPPORT
 static isc_boolean_t
-is_anycast(struct sockaddr *sa, char *name)
+is_not_bindable(struct sockaddr *sa, char *name)
 {
-#if defined(SIOCGIFAFLAG_IN6) && defined(IN6_IFF_ANYCAST)
+#if defined(SIOCGIFAFLAG_IN6) && \
+          (defined(IN6_IFF_ANYCAST) || defined(IN6_IFF_NOTREADY))
        struct in6_ifreq ifr6;
        int fd;
-       u_int32_t flags6;
+       u_int32_t flags6, exclude = 0;
 
        if (sa->sa_family != AF_INET6)
                return ISC_FALSE;
@@ -1197,9 +1198,15 @@ is_anycast(struct sockaddr *sa, char *na
        }
        close(fd);
        flags6 = ifr6.ifr_ifru.ifru_flags6;
-       if ((flags6 & IN6_IFF_ANYCAST) != 0)
+#if defined(IN6_IFF_ANYCAST)
+       exclude |= IN6_IFF_ANYCAST;
+#endif /* !IN6_IFF_ANYCAST */
+#if defined(IN6_IFF_NOTREADY)
+       exclude |= IN6_IFF_NOTREADY;
+#endif /* !IN6_IFF_NOTREADY */
+       if ((flags6 & exclude) != 0)
                return ISC_TRUE;
-#endif /* !SIOCGIFAFLAG_IN6 || !IN6_IFF_ANYCAST */
+#endif /* !SIOCGIFAFLAG_IN6 || !(IN6_IFF_ANYCAST && IN6_IFF_NOTREADY) */
        return ISC_FALSE;
 }
 #endif /* !INCLUDE_IPV6_SUPPORT */
@@ -1344,7 +1351,7 @@ update_interfaces(
                        continue;
 
 #ifdef INCLUDE_IPV6_SUPPORT
-               if (is_anycast((struct sockaddr *)&interface.sin, isc_if.name))
+               if (is_not_bindable((struct sockaddr *)&interface.sin, 
isc_if.name))
                        continue;
 #endif /* !INCLUDE_IPV6_SUPPORT */
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to