diff options
author | luigi <luigi@FreeBSD.org> | 2014-09-25 16:22:32 +0000 |
---|---|---|
committer | luigi <luigi@FreeBSD.org> | 2014-09-25 16:22:32 +0000 |
commit | b8be8bfdc83c495bfe4982f71017757f881dabd5 (patch) | |
tree | e4c3f33cbb9da94ff180f2fd144e2c7575317af9 /sys/dev/netmap/netmap.c | |
parent | ca2279d44a3566723039f8c5ec99a22f7783aae7 (diff) | |
download | FreeBSD-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.c | 25 |
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; } |