diff options
author | luigi <luigi@FreeBSD.org> | 2014-10-06 09:46:21 +0000 |
---|---|---|
committer | luigi <luigi@FreeBSD.org> | 2014-10-06 09:46:21 +0000 |
commit | 5aadc8e180a6ab8f7facb6ed823e8747a086da80 (patch) | |
tree | d2ccd282d28bc5cfdef1a8efe265518670589f58 | |
parent | 2014ab03540e62e3a46f9b1ecd1df3dd1e5af82f (diff) | |
download | FreeBSD-src-5aadc8e180a6ab8f7facb6ed823e8747a086da80.zip FreeBSD-src-5aadc8e180a6ab8f7facb6ed823e8747a086da80.tar.gz |
MFC r272111
fix a panic when passing ifioctl from a netmap file descriptor to
the underlying device. This needs to be merged to 10.1
-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; } |