Author: markj
Date: Thu Jun  2 17:21:57 2016
New Revision: 301214
URL: https://svnweb.freebsd.org/changeset/base/301214

Log:
  Exploit r301213 to fix in6 ifaddr locking in pfxlist_onlink_check().
  
  Reviewed by:  ae, hrs
  MFC after:    2 weeks
  Differential Revision:        https://reviews.freebsd.org/D6639

Modified:
  head/sys/netinet6/nd6_rtr.c

Modified: head/sys/netinet6/nd6_rtr.c
==============================================================================
--- head/sys/netinet6/nd6_rtr.c Thu Jun  2 17:17:15 2016        (r301213)
+++ head/sys/netinet6/nd6_rtr.c Thu Jun  2 17:21:57 2016        (r301214)
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/lock.h>
 #include <sys/errno.h>
+#include <sys/rmlock.h>
 #include <sys/rwlock.h>
 #include <sys/syslog.h>
 #include <sys/queue.h>
@@ -1437,12 +1438,13 @@ find_pfxlist_reachable_router(struct nd_
  * is no router around us.
  */
 void
-pfxlist_onlink_check()
+pfxlist_onlink_check(void)
 {
        struct nd_prefix *pr;
        struct in6_ifaddr *ifa;
        struct nd_defrouter *dr;
        struct nd_pfxrouter *pfxrtr = NULL;
+       struct rm_priotracker in6_ifa_tracker;
 
        /*
         * Check if there is a prefix that has a reachable advertising
@@ -1573,9 +1575,8 @@ pfxlist_onlink_check()
         * detached.  Note, however, that a manually configured address should
         * always be attached.
         * The precise detection logic is same as the one for prefixes.
-        *
-        * XXXRW: in6_ifaddrhead locking.
         */
+       IN6_IFADDR_RLOCK(&in6_ifa_tracker);
        TAILQ_FOREACH(ifa, &V_in6_ifaddrhead, ia_link) {
                if (!(ifa->ia6_flags & IN6_IFF_AUTOCONF))
                        continue;
@@ -1610,8 +1611,7 @@ pfxlist_onlink_check()
                                ifa->ia6_flags |= IN6_IFF_DETACHED;
                        }
                }
-       }
-       else {
+       } else {
                TAILQ_FOREACH(ifa, &V_in6_ifaddrhead, ia_link) {
                        if ((ifa->ia6_flags & IN6_IFF_AUTOCONF) == 0)
                                continue;
@@ -1624,6 +1624,7 @@ pfxlist_onlink_check()
                        }
                }
        }
+       IN6_IFADDR_RUNLOCK(&in6_ifa_tracker);
 }
 
 static int
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to