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; }