summaryrefslogtreecommitdiffstats
path: root/sys/net/rtsock.c
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2016-11-22 17:42:59 +0000
committermarkj <markj@FreeBSD.org>2016-11-22 17:42:59 +0000
commitbd808e3ce8fe9348fc6cbaff866f00e08fdc0421 (patch)
treeebdc3ae876e8bfe11b74a82e7103b9833db816e1 /sys/net/rtsock.c
parentdb75d5027e10e6a41b54cb66e21f2fe7480a1618 (diff)
downloadFreeBSD-src-bd808e3ce8fe9348fc6cbaff866f00e08fdc0421.zip
FreeBSD-src-bd808e3ce8fe9348fc6cbaff866f00e08fdc0421.tar.gz
MFC r308694:
Plug a lock leak in sysctl_ifmalist(). PR: 214542
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r--sys/net/rtsock.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index 91158b0..1ffb997 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -1768,13 +1768,15 @@ done:
static int
sysctl_ifmalist(int af, struct walkarg *w)
{
- struct ifnet *ifp;
- struct ifmultiaddr *ifma;
- struct rt_addrinfo info;
- int len, error = 0;
+ struct rt_addrinfo info;
struct ifaddr *ifa;
+ struct ifmultiaddr *ifma;
+ struct ifnet *ifp;
+ int error, len;
+ error = 0;
bzero((caddr_t)&info, sizeof(info));
+
IFNET_RLOCK_NOSLEEP();
TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
if (w->w_arg && w->w_arg != ifp->if_index)
@@ -1794,7 +1796,7 @@ sysctl_ifmalist(int af, struct walkarg *w)
ifma->ifma_lladdr : NULL;
error = rtsock_msg_buffer(RTM_NEWMADDR, &info, w, &len);
if (error != 0)
- goto done;
+ break;
if (w->w_req && w->w_tmem) {
struct ifma_msghdr *ifmam;
@@ -1803,15 +1805,14 @@ sysctl_ifmalist(int af, struct walkarg *w)
ifmam->ifmam_flags = 0;
ifmam->ifmam_addrs = info.rti_addrs;
error = SYSCTL_OUT(w->w_req, w->w_tmem, len);
- if (error) {
- IF_ADDR_RUNLOCK(ifp);
- goto done;
- }
+ if (error != 0)
+ break;
}
}
IF_ADDR_RUNLOCK(ifp);
+ if (error != 0)
+ break;
}
-done:
IFNET_RUNLOCK_NOSLEEP();
return (error);
}
OpenPOWER on IntegriCloud