aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2014-01-16 12:35:18 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2014-01-16 12:35:18 +0000
commita49b317c4102b1ba27da259b49fb1eaa18a86b02 (patch)
tree1b9ccc8dda26b64611db25f9dfe1c23e533ea616 /sys/netinet
parent19f5e9076bdf3e211a5eead0bf2f1360fbcc20b7 (diff)
downloadsrc-a49b317c4102b1ba27da259b49fb1eaa18a86b02.tar.gz
src-a49b317c4102b1ba27da259b49fb1eaa18a86b02.zip
Fix refcount leak on netinet ifa.
Reviewed by: glebius MFC after: 2 weeks Sponsored by: Yandex LLC
Notes
Notes: svn path=/head/; revision=260707
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/in.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index 6624c1ac5557..e4a54b2716de 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -408,7 +408,7 @@ in_aifaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
if (ifp->if_flags & IFF_LOOPBACK)
ia->ia_dstaddr = ia->ia_addr;
- ifa_ref(ifa); /* if_addrhead */
+ /* if_addrhead is already referenced by ifa_alloc() */
IF_ADDR_WLOCK(ifp);
TAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link);
IF_ADDR_WUNLOCK(ifp);
@@ -495,13 +495,13 @@ fail1:
IF_ADDR_WLOCK(ifp);
TAILQ_REMOVE(&ifp->if_addrhead, &ia->ia_ifa, ifa_link);
IF_ADDR_WUNLOCK(ifp);
- ifa_free(&ia->ia_ifa);
+ ifa_free(&ia->ia_ifa); /* if_addrhead */
IN_IFADDR_WLOCK();
TAILQ_REMOVE(&V_in_ifaddrhead, ia, ia_link);
LIST_REMOVE(ia, ia_hash);
IN_IFADDR_WUNLOCK();
- ifa_free(&ia->ia_ifa);
+ ifa_free(&ia->ia_ifa); /* in_ifaddrhead */
return (error);
}
@@ -565,7 +565,6 @@ in_difaddr_ioctl(caddr_t data, struct ifnet *ifp, struct thread *td)
TAILQ_REMOVE(&V_in_ifaddrhead, ia, ia_link);
LIST_REMOVE(ia, ia_hash);
IN_IFADDR_WUNLOCK();
- ifa_free(&ia->ia_ifa); /* in_ifaddrhead */
/*
* in_scrubprefix() kills the interface route.
@@ -601,6 +600,7 @@ in_difaddr_ioctl(caddr_t data, struct ifnet *ifp, struct thread *td)
}
EVENTHANDLER_INVOKE(ifaddr_event, ifp);
+ ifa_free(&ia->ia_ifa); /* in_ifaddrhead */
return (0);
}