Message ID | 1464248432-12595-1-git-send-email-prasunmaiti87@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Johannes Berg |
Headers | show |
Hi, I must say, this is a bit of a surprise - where is iwpriv actually still relevant? What driver could this possibly matter for? Anyway ... > + if (dev->netdev_ops->ndo_do_ioctl) { > + if ((info->flags & IW_REQUEST_FLAG_COMPAT) && > + (cmd >= SIOCIWFIRSTPRIV && cmd <= > SIOCIWLASTPRIV)) { This has coding style issues, obviously. Also, handling the non-compat case would allow you to return and reduce indentation by one in the large code block that handles the compat. > + int ret = 0; > + struct compat_iw_point *iwp_compat = (struct compat_iw_point *) &iwr->u.data; > + struct iw_point *iwp = &iwr->u.data; > + __u16 length = iwp_compat->length, flags = iwp_compat->flags; > + > + iwp->pointer = compat_ptr(iwp_compat->pointer); > + iwp->length = length; > + iwp->flags = flags; > + > + ret = dev->netdev_ops->ndo_do_ioctl(dev, ifr, cmd); > + > + length = iwp->length; > + flags = iwp->flags; > + iwp_compat->pointer = ptr_to_compat(iwp->pointer); > + iwp_compat->length = length; > + iwp_compat->flags = flags; Why don't you just put another ifr/iwr on the stack, and use that to pass things to the driver? This modify-in-place of 'iwp', which requires loading all the variables first, seems very awkward to me. johannes -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
--- a/net/wireless/wext-core.c +++ b/net/wireless/wext-core.c @@ -955,8 +955,30 @@ static int wireless_process_ioctl(struct net *net, struct ifreq *ifr, return private(dev, iwr, cmd, info, handler); } /* Old driver API : call driver ioctl handler */ - if (dev->netdev_ops->ndo_do_ioctl) - return dev->netdev_ops->ndo_do_ioctl(dev, ifr, cmd); + if (dev->netdev_ops->ndo_do_ioctl) { + if ((info->flags & IW_REQUEST_FLAG_COMPAT) && + (cmd >= SIOCIWFIRSTPRIV && cmd <= SIOCIWLASTPRIV)) { + int ret = 0; + struct compat_iw_point *iwp_compat = (struct compat_iw_point *) &iwr->u.data; + struct iw_point *iwp = &iwr->u.data; + __u16 length = iwp_compat->length, flags = iwp_compat->flags; + + iwp->pointer = compat_ptr(iwp_compat->pointer); + iwp->length = length; + iwp->flags = flags; + + ret = dev->netdev_ops->ndo_do_ioctl(dev, ifr, cmd); + + length = iwp->length; + flags = iwp->flags; + iwp_compat->pointer = ptr_to_compat(iwp->pointer); + iwp_compat->length = length; + iwp_compat->flags = flags; + return ret; + } else { + return dev->netdev_ops->ndo_do_ioctl(dev, ifr, cmd); + } + } return -EOPNOTSUPP; }