Module Name:    src
Committed By:   christos
Date:           Mon Jan  2 23:00:25 UTC 2017

Modified Files:
        src/sys/netinet: in.c in_var.h

Log Message:
- You can't just call the pfil hook to remove an address before an address
  is removed! Hold a reference instead, remove it, and then free it.
- GC iatoifa()


To generate a diff of this commit:
cvs rdiff -u -r1.194 -r1.195 src/sys/netinet/in.c
cvs rdiff -u -r1.90 -r1.91 src/sys/netinet/in_var.h

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

Modified files:

Index: src/sys/netinet/in.c
diff -u src/sys/netinet/in.c:1.194 src/sys/netinet/in.c:1.195
--- src/sys/netinet/in.c:1.194	Sat Dec 31 04:41:05 2016
+++ src/sys/netinet/in.c	Mon Jan  2 18:00:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: in.c,v 1.194 2016/12/31 09:41:05 ryo Exp $	*/
+/*	$NetBSD: in.c,v 1.195 2017/01/02 23:00:25 christos Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.194 2016/12/31 09:41:05 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.195 2017/01/02 23:00:25 christos Exp $");
 
 #include "arp.h"
 
@@ -668,9 +668,11 @@ in_control0(struct socket *so, u_long cm
 		break;
 
 	case SIOCDIFADDR:
-		pfil_run_addrhooks(if_pfil, cmd, iatoifa(ia));
 		ia4_release(ia, &psref);
+		ifaref(&ia->ia_ifa);
 		in_purgeaddr(&ia->ia_ifa);
+		pfil_run_addrhooks(if_pfil, cmd, &ia->ia_ifa);
+		ifafree(&ia->ia_ifa);
 		ia = NULL;
 		break;
 
@@ -705,7 +707,7 @@ in_control0(struct socket *so, u_long cm
 
 	if (error == 0) {
 		if (run_hook)
-			pfil_run_addrhooks(if_pfil, cmd, iatoifa(ia));
+			pfil_run_addrhooks(if_pfil, cmd, &ia->ia_ifa);
 	} else if (newifaddr) {
 		KASSERT(ia != NULL);
 		in_purgeaddr(&ia->ia_ifa);

Index: src/sys/netinet/in_var.h
diff -u src/sys/netinet/in_var.h:1.90 src/sys/netinet/in_var.h:1.91
--- src/sys/netinet/in_var.h:1.90	Tue Dec  6 02:01:47 2016
+++ src/sys/netinet/in_var.h	Mon Jan  2 18:00:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_var.h,v 1.90 2016/12/06 07:01:47 knakahara Exp $	*/
+/*	$NetBSD: in_var.h,v 1.91 2017/01/02 23:00:25 christos Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -148,8 +148,6 @@ struct	in_aliasreq {
  */
 #define	IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr))
 
-#define iatoifa(ia)	(struct ifaddr *)(ia)
-
 #ifdef _KERNEL
 
 /* Note: 61, 127, 251, 509, 1021, 2039 are good. */

Reply via email to