diff options
author | melifaro <melifaro@FreeBSD.org> | 2014-01-16 12:35:18 +0000 |
---|---|---|
committer | melifaro <melifaro@FreeBSD.org> | 2014-01-16 12:35:18 +0000 |
commit | 0092f95bccb69a3200a98465453bd7efe6ed31d2 (patch) | |
tree | 1b9ccc8dda26b64611db25f9dfe1c23e533ea616 /sys/netinet | |
parent | 113f9a4f5312f631ee8d97ab8641c3064e6a60ca (diff) | |
download | FreeBSD-src-0092f95bccb69a3200a98465453bd7efe6ed31d2.zip FreeBSD-src-0092f95bccb69a3200a98465453bd7efe6ed31d2.tar.gz |
Fix refcount leak on netinet ifa.
Reviewed by: glebius
MFC after: 2 weeks
Sponsored by: Yandex LLC
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 6624c1a..e4a54b2 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); } |