Module Name:    src
Committed By:   ozaki-r
Date:           Tue Mar  6 07:25:27 UTC 2018

Modified Files:
        src/sys/net: if_llatbl.c
        src/sys/netinet: in.c
        src/sys/netinet6: in6.c

Log Message:
Fix memory leaks on arp -d and ndp -d for static entries

We have to delete entries on in_lltable_delete and in6_lltable_delete
unconditionally.  Note that we don't need to worry about LLE_IFADDR because
there is no such entries now.


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/net/if_llatbl.c
cvs rdiff -u -r1.221 -r1.222 src/sys/netinet/in.c
cvs rdiff -u -r1.262 -r1.263 src/sys/netinet6/in6.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_llatbl.c
diff -u src/sys/net/if_llatbl.c:1.24 src/sys/net/if_llatbl.c:1.25
--- src/sys/net/if_llatbl.c:1.24	Tue Mar  6 07:24:01 2018
+++ src/sys/net/if_llatbl.c	Tue Mar  6 07:25:27 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_llatbl.c,v 1.24 2018/03/06 07:24:01 ozaki-r Exp $	*/
+/*	$NetBSD: if_llatbl.c,v 1.25 2018/03/06 07:25:27 ozaki-r Exp $	*/
 /*
  * Copyright (c) 2004 Luigi Rizzo, Alessandro Cerri. All rights reserved.
  * Copyright (c) 2004-2008 Qing Li. All rights reserved.
@@ -351,6 +351,8 @@ llentry_free(struct llentry *lle)
 
 	LLE_WLOCK_ASSERT(lle);
 
+	lle->la_flags |= LLE_DELETED;
+
 	if ((lle->la_flags & LLE_LINKED) != 0) {
 		llt = lle->lle_tbl;
 

Index: src/sys/netinet/in.c
diff -u src/sys/netinet/in.c:1.221 src/sys/netinet/in.c:1.222
--- src/sys/netinet/in.c:1.221	Tue Mar  6 07:24:01 2018
+++ src/sys/netinet/in.c	Tue Mar  6 07:25:27 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: in.c,v 1.221 2018/03/06 07:24:01 ozaki-r Exp $	*/
+/*	$NetBSD: in.c,v 1.222 2018/03/06 07:25:27 ozaki-r 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.221 2018/03/06 07:24:01 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.222 2018/03/06 07:25:27 ozaki-r Exp $");
 
 #include "arp.h"
 
@@ -2135,7 +2135,6 @@ in_lltable_delete(struct lltable *llt, u
 	}
 
 	LLE_WLOCK(lle);
-	lle->la_flags |= LLE_DELETED;
 #ifdef LLTABLE_DEBUG
 	{
 		char buf[64];
@@ -2144,10 +2143,7 @@ in_lltable_delete(struct lltable *llt, u
 		    __func__, buf, lle);
 	}
 #endif
-	if ((lle->la_flags & (LLE_STATIC | LLE_IFADDR)) == LLE_STATIC)
-		llentry_free(lle);
-	else
-		LLE_WUNLOCK(lle);
+	llentry_free(lle);
 
 	return (0);
 }

Index: src/sys/netinet6/in6.c
diff -u src/sys/netinet6/in6.c:1.262 src/sys/netinet6/in6.c:1.263
--- src/sys/netinet6/in6.c:1.262	Tue Mar  6 07:24:01 2018
+++ src/sys/netinet6/in6.c	Tue Mar  6 07:25:27 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6.c,v 1.262 2018/03/06 07:24:01 ozaki-r Exp $	*/
+/*	$NetBSD: in6.c,v 1.263 2018/03/06 07:25:27 ozaki-r Exp $	*/
 /*	$KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.262 2018/03/06 07:24:01 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.263 2018/03/06 07:25:27 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -2549,7 +2549,6 @@ in6_lltable_delete(struct lltable *llt, 
 	}
 
 	LLE_WLOCK(lle);
-	lle->la_flags |= LLE_DELETED;
 #ifdef LLTABLE_DEBUG
 	{
 		char buf[64];
@@ -2558,10 +2557,7 @@ in6_lltable_delete(struct lltable *llt, 
 		    __func__, buf, lle);
 	}
 #endif
-	if ((lle->la_flags & (LLE_STATIC | LLE_IFADDR)) == LLE_STATIC)
-		llentry_free(lle);
-	else
-		LLE_WUNLOCK(lle);
+	llentry_free(lle);
 
 	return 0;
 }

Reply via email to