Module Name:    src
Committed By:   ozaki-r
Date:           Thu Jul 31 06:35:47 UTC 2014

Modified Files:
        src/sys/net: if.c if.h
        src/sys/netinet6: nd6_rtr.c

Log Message:
Define IFADDR_FOREACH_SAFE for on-the-fly element removal in a loop

We have to use it when we purge an address element in an ifaddr loop.

This change restores the original behavior that was accidentally degraded.


To generate a diff of this commit:
cvs rdiff -u -r1.288 -r1.289 src/sys/net/if.c
cvs rdiff -u -r1.173 -r1.174 src/sys/net/if.h
cvs rdiff -u -r1.92 -r1.93 src/sys/netinet6/nd6_rtr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if.c
diff -u src/sys/net/if.c:1.288 src/sys/net/if.c:1.289
--- src/sys/net/if.c:1.288	Wed Jul 30 13:32:09 2014
+++ src/sys/net/if.c	Thu Jul 31 06:35:47 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.c,v 1.288 2014/07/30 13:32:09 ozaki-r Exp $	*/
+/*	$NetBSD: if.c,v 1.289 2014/07/31 06:35:47 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.288 2014/07/30 13:32:09 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.289 2014/07/31 06:35:47 ozaki-r Exp $");
 
 #include "opt_inet.h"
 
@@ -697,9 +697,9 @@ if_deactivate(struct ifnet *ifp)
 void
 if_purgeaddrs(struct ifnet *ifp, int family, void (*purgeaddr)(struct ifaddr *))
 {
-	struct ifaddr *ifa;
+	struct ifaddr *ifa, *nifa;
 
-	IFADDR_FOREACH(ifa, ifp) {
+	IFADDR_FOREACH_SAFE(ifa, ifp, nifa) {
 		if (ifa->ifa_addr->sa_family != family)
 			continue;
 		(*purgeaddr)(ifa);

Index: src/sys/net/if.h
diff -u src/sys/net/if.h:1.173 src/sys/net/if.h:1.174
--- src/sys/net/if.h:1.173	Thu Jul 31 02:21:51 2014
+++ src/sys/net/if.h	Thu Jul 31 06:35:47 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.h,v 1.173 2014/07/31 02:21:51 ozaki-r Exp $	*/
+/*	$NetBSD: if.h,v 1.174 2014/07/31 06:35:47 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -988,6 +988,9 @@ __END_DECLS
 #define	IFADDR_NEXT(__ifa)		TAILQ_NEXT((__ifa), ifa_list)
 #define	IFADDR_FOREACH(__ifa, __ifp)	TAILQ_FOREACH(__ifa, \
 					    &(__ifp)->if_addrlist, ifa_list)
+#define	IFADDR_FOREACH_SAFE(__ifa, __ifp, __nifa) \
+					    TAILQ_FOREACH_SAFE(__ifa, \
+					    &(__ifp)->if_addrlist, ifa_list, __nifa)
 #define	IFADDR_EMPTY(__ifp)		TAILQ_EMPTY(&(__ifp)->if_addrlist)
 
 extern struct ifnet_head ifnet_list;

Index: src/sys/netinet6/nd6_rtr.c
diff -u src/sys/netinet6/nd6_rtr.c:1.92 src/sys/netinet6/nd6_rtr.c:1.93
--- src/sys/netinet6/nd6_rtr.c:1.92	Fri Jul 25 07:12:55 2014
+++ src/sys/netinet6/nd6_rtr.c	Thu Jul 31 06:35:47 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6_rtr.c,v 1.92 2014/07/25 07:12:55 ozaki-r Exp $	*/
+/*	$NetBSD: nd6_rtr.c,v 1.93 2014/07/31 06:35:47 ozaki-r Exp $	*/
 /*	$KAME: nd6_rtr.c,v 1.95 2001/02/07 08:09:47 itojun Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.92 2014/07/25 07:12:55 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.93 2014/07/31 06:35:47 ozaki-r Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -897,7 +897,7 @@ purge_detached(struct ifnet *ifp)
 {
 	struct nd_prefix *pr, *pr_next;
 	struct in6_ifaddr *ia;
-	struct ifaddr *ifa;
+	struct ifaddr *ifa, *ifa_next;
 
 	for (pr = nd_prefix.lh_first; pr; pr = pr_next) {
 		pr_next = pr->ndpr_next;
@@ -915,7 +915,7 @@ purge_detached(struct ifnet *ifp)
 		    !LIST_EMPTY(&pr->ndpr_advrtrs)))
 			continue;
 
-		IFADDR_FOREACH(ifa, ifp) {
+		IFADDR_FOREACH_SAFE(ifa, ifp, ifa_next) {
 			if (ifa->ifa_addr->sa_family != AF_INET6)
 				continue;
 			ia = (struct in6_ifaddr *)ifa;

Reply via email to