diff options
author | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2014-01-16 12:35:18 +0000 |
---|---|---|
committer | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2014-01-16 12:35:18 +0000 |
commit | a49b317c4102b1ba27da259b49fb1eaa18a86b02 (patch) | |
tree | 1b9ccc8dda26b64611db25f9dfe1c23e533ea616 /sys/netinet | |
parent | 19f5e9076bdf3e211a5eead0bf2f1360fbcc20b7 (diff) | |
download | src-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.c | 8 |
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); } |