summaryrefslogtreecommitdiffstats
path: root/sys/dev/netmap/netmap.c
diff options
context:
space:
mode:
authorluigi <luigi@FreeBSD.org>2014-09-25 16:22:32 +0000
committerluigi <luigi@FreeBSD.org>2014-09-25 16:22:32 +0000
commitb8be8bfdc83c495bfe4982f71017757f881dabd5 (patch)
treee4c3f33cbb9da94ff180f2fd144e2c7575317af9 /sys/dev/netmap/netmap.c
parentca2279d44a3566723039f8c5ec99a22f7783aae7 (diff)
downloadFreeBSD-src-b8be8bfdc83c495bfe4982f71017757f881dabd5.zip
FreeBSD-src-b8be8bfdc83c495bfe4982f71017757f881dabd5.tar.gz
fix a panic when passing ifioctl from a netmap file descriptor to
the underlying device. This needs to be merged to 10.1 Reported by: Patrick Kelsey MFC after: 3 days
Diffstat (limited to 'sys/dev/netmap/netmap.c')
-rw-r--r--sys/dev/netmap/netmap.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c
index 0fd362f..f37bf9e 100644
--- a/sys/dev/netmap/netmap.c
+++ b/sys/dev/netmap/netmap.c
@@ -2222,23 +2222,18 @@ netmap_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
default: /* allow device-specific ioctls */
{
- struct socket so;
- struct ifnet *ifp;
+ struct ifnet *ifp = ifunit_ref(nmr->nr_name);
+ if (ifp == NULL) {
+ error = ENXIO;
+ } else {
+ struct socket so;
- bzero(&so, sizeof(so));
- NMG_LOCK();
- error = netmap_get_na(nmr, &na, 0 /* don't create */); /* keep reference */
- if (error) {
- netmap_adapter_put(na);
- NMG_UNLOCK();
- break;
+ bzero(&so, sizeof(so));
+ so.so_vnet = ifp->if_vnet;
+ // so->so_proto not null.
+ error = ifioctl(&so, cmd, data, td);
+ if_rele(ifp);
}
- ifp = na->ifp;
- so.so_vnet = ifp->if_vnet;
- // so->so_proto not null.
- error = ifioctl(&so, cmd, data, td);
- netmap_adapter_put(na);
- NMG_UNLOCK();
break;
}
OpenPOWER on IntegriCloud