hamradio: use ndo_siocdevprivate
hamradio uses a set of private ioctls that do seem to work correctly in compat mode, as they only rely on the ifr_data pointer. Move them over to the ndo_siocdevprivate callback as a cleanup. Cc: Thomas Sailer <t.sailer@alumni.ethz.ch> Cc: Joerg Reuter <jreuter@yaina.de> Cc: Jean-Paul Roubelat <jpr@f6fbb.org> Cc: linux-hams@vger.kernel.org Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ebb4a911e0
commit
25ec92fbdd
@ -1005,7 +1005,8 @@ static int baycom_setmode(struct baycom_state *bc, const char *modestr)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
static int baycom_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
|
||||||
|
void __user *data, int cmd)
|
||||||
{
|
{
|
||||||
struct baycom_state *bc = netdev_priv(dev);
|
struct baycom_state *bc = netdev_priv(dev);
|
||||||
struct hdlcdrv_ioctl hi;
|
struct hdlcdrv_ioctl hi;
|
||||||
@ -1013,7 +1014,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
if (cmd != SIOCDEVPRIVATE)
|
if (cmd != SIOCDEVPRIVATE)
|
||||||
return -ENOIOCTLCMD;
|
return -ENOIOCTLCMD;
|
||||||
|
|
||||||
if (copy_from_user(&hi, ifr->ifr_data, sizeof(hi)))
|
if (copy_from_user(&hi, data, sizeof(hi)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
switch (hi.cmd) {
|
switch (hi.cmd) {
|
||||||
default:
|
default:
|
||||||
@ -1104,7 +1105,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
return HDLCDRV_PARMASK_IOBASE;
|
return HDLCDRV_PARMASK_IOBASE;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (copy_to_user(ifr->ifr_data, &hi, sizeof(hi)))
|
if (copy_to_user(data, &hi, sizeof(hi)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1114,7 +1115,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
static const struct net_device_ops baycom_netdev_ops = {
|
static const struct net_device_ops baycom_netdev_ops = {
|
||||||
.ndo_open = epp_open,
|
.ndo_open = epp_open,
|
||||||
.ndo_stop = epp_close,
|
.ndo_stop = epp_close,
|
||||||
.ndo_do_ioctl = baycom_ioctl,
|
.ndo_siocdevprivate = baycom_siocdevprivate,
|
||||||
.ndo_start_xmit = baycom_send_packet,
|
.ndo_start_xmit = baycom_send_packet,
|
||||||
.ndo_set_mac_address = baycom_set_mac_address,
|
.ndo_set_mac_address = baycom_set_mac_address,
|
||||||
};
|
};
|
||||||
|
@ -380,7 +380,7 @@ static int par96_close(struct net_device *dev)
|
|||||||
* ===================== hdlcdrv driver interface =========================
|
* ===================== hdlcdrv driver interface =========================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
static int baycom_ioctl(struct net_device *dev, void __user *data,
|
||||||
struct hdlcdrv_ioctl *hi, int cmd);
|
struct hdlcdrv_ioctl *hi, int cmd);
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
@ -408,7 +408,7 @@ static int baycom_setmode(struct baycom_state *bc, const char *modestr)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
static int baycom_ioctl(struct net_device *dev, void __user *data,
|
||||||
struct hdlcdrv_ioctl *hi, int cmd)
|
struct hdlcdrv_ioctl *hi, int cmd)
|
||||||
{
|
{
|
||||||
struct baycom_state *bc;
|
struct baycom_state *bc;
|
||||||
@ -428,7 +428,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
|
|
||||||
case HDLCDRVCTL_GETMODE:
|
case HDLCDRVCTL_GETMODE:
|
||||||
strcpy(hi->data.modename, bc->options ? "par96" : "picpar");
|
strcpy(hi->data.modename, bc->options ? "par96" : "picpar");
|
||||||
if (copy_to_user(ifr->ifr_data, hi, sizeof(struct hdlcdrv_ioctl)))
|
if (copy_to_user(data, hi, sizeof(struct hdlcdrv_ioctl)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -440,7 +440,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
|
|
||||||
case HDLCDRVCTL_MODELIST:
|
case HDLCDRVCTL_MODELIST:
|
||||||
strcpy(hi->data.modename, "par96,picpar");
|
strcpy(hi->data.modename, "par96,picpar");
|
||||||
if (copy_to_user(ifr->ifr_data, hi, sizeof(struct hdlcdrv_ioctl)))
|
if (copy_to_user(data, hi, sizeof(struct hdlcdrv_ioctl)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -449,7 +449,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copy_from_user(&bi, ifr->ifr_data, sizeof(bi)))
|
if (copy_from_user(&bi, data, sizeof(bi)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
switch (bi.cmd) {
|
switch (bi.cmd) {
|
||||||
default:
|
default:
|
||||||
@ -464,7 +464,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
#endif /* BAYCOM_DEBUG */
|
#endif /* BAYCOM_DEBUG */
|
||||||
|
|
||||||
}
|
}
|
||||||
if (copy_to_user(ifr->ifr_data, &bi, sizeof(bi)))
|
if (copy_to_user(data, &bi, sizeof(bi)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -462,7 +462,7 @@ static int ser12_close(struct net_device *dev)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
static int baycom_ioctl(struct net_device *dev, void __user *data,
|
||||||
struct hdlcdrv_ioctl *hi, int cmd);
|
struct hdlcdrv_ioctl *hi, int cmd);
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
@ -497,7 +497,7 @@ static int baycom_setmode(struct baycom_state *bc, const char *modestr)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
static int baycom_ioctl(struct net_device *dev, void __user *data,
|
||||||
struct hdlcdrv_ioctl *hi, int cmd)
|
struct hdlcdrv_ioctl *hi, int cmd)
|
||||||
{
|
{
|
||||||
struct baycom_state *bc;
|
struct baycom_state *bc;
|
||||||
@ -519,7 +519,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
sprintf(hi->data.modename, "ser%u", bc->baud / 100);
|
sprintf(hi->data.modename, "ser%u", bc->baud / 100);
|
||||||
if (bc->opt_dcd <= 0)
|
if (bc->opt_dcd <= 0)
|
||||||
strcat(hi->data.modename, (!bc->opt_dcd) ? "*" : "+");
|
strcat(hi->data.modename, (!bc->opt_dcd) ? "*" : "+");
|
||||||
if (copy_to_user(ifr->ifr_data, hi, sizeof(struct hdlcdrv_ioctl)))
|
if (copy_to_user(data, hi, sizeof(struct hdlcdrv_ioctl)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -531,7 +531,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
|
|
||||||
case HDLCDRVCTL_MODELIST:
|
case HDLCDRVCTL_MODELIST:
|
||||||
strcpy(hi->data.modename, "ser12,ser3,ser24");
|
strcpy(hi->data.modename, "ser12,ser3,ser24");
|
||||||
if (copy_to_user(ifr->ifr_data, hi, sizeof(struct hdlcdrv_ioctl)))
|
if (copy_to_user(data, hi, sizeof(struct hdlcdrv_ioctl)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -540,7 +540,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copy_from_user(&bi, ifr->ifr_data, sizeof(bi)))
|
if (copy_from_user(&bi, data, sizeof(bi)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
switch (bi.cmd) {
|
switch (bi.cmd) {
|
||||||
default:
|
default:
|
||||||
@ -555,7 +555,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
#endif /* BAYCOM_DEBUG */
|
#endif /* BAYCOM_DEBUG */
|
||||||
|
|
||||||
}
|
}
|
||||||
if (copy_to_user(ifr->ifr_data, &bi, sizeof(bi)))
|
if (copy_to_user(data, &bi, sizeof(bi)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -521,7 +521,7 @@ static int ser12_close(struct net_device *dev)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
static int baycom_ioctl(struct net_device *dev, void __user *data,
|
||||||
struct hdlcdrv_ioctl *hi, int cmd);
|
struct hdlcdrv_ioctl *hi, int cmd);
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
@ -551,7 +551,7 @@ static int baycom_setmode(struct baycom_state *bc, const char *modestr)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
static int baycom_ioctl(struct net_device *dev, void __user *data,
|
||||||
struct hdlcdrv_ioctl *hi, int cmd)
|
struct hdlcdrv_ioctl *hi, int cmd)
|
||||||
{
|
{
|
||||||
struct baycom_state *bc;
|
struct baycom_state *bc;
|
||||||
@ -573,7 +573,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
strcpy(hi->data.modename, "ser12");
|
strcpy(hi->data.modename, "ser12");
|
||||||
if (bc->opt_dcd <= 0)
|
if (bc->opt_dcd <= 0)
|
||||||
strcat(hi->data.modename, (!bc->opt_dcd) ? "*" : (bc->opt_dcd == -2) ? "@" : "+");
|
strcat(hi->data.modename, (!bc->opt_dcd) ? "*" : (bc->opt_dcd == -2) ? "@" : "+");
|
||||||
if (copy_to_user(ifr->ifr_data, hi, sizeof(struct hdlcdrv_ioctl)))
|
if (copy_to_user(data, hi, sizeof(struct hdlcdrv_ioctl)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -585,7 +585,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
|
|
||||||
case HDLCDRVCTL_MODELIST:
|
case HDLCDRVCTL_MODELIST:
|
||||||
strcpy(hi->data.modename, "ser12");
|
strcpy(hi->data.modename, "ser12");
|
||||||
if (copy_to_user(ifr->ifr_data, hi, sizeof(struct hdlcdrv_ioctl)))
|
if (copy_to_user(data, hi, sizeof(struct hdlcdrv_ioctl)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -594,7 +594,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copy_from_user(&bi, ifr->ifr_data, sizeof(bi)))
|
if (copy_from_user(&bi, data, sizeof(bi)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
switch (bi.cmd) {
|
switch (bi.cmd) {
|
||||||
default:
|
default:
|
||||||
@ -609,7 +609,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
|
|||||||
#endif /* BAYCOM_DEBUG */
|
#endif /* BAYCOM_DEBUG */
|
||||||
|
|
||||||
}
|
}
|
||||||
if (copy_to_user(ifr->ifr_data, &bi, sizeof(bi)))
|
if (copy_to_user(data, &bi, sizeof(bi)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -314,9 +314,10 @@ static int bpq_set_mac_address(struct net_device *dev, void *addr)
|
|||||||
* source ethernet address (broadcast
|
* source ethernet address (broadcast
|
||||||
* or multicast: accept all)
|
* or multicast: accept all)
|
||||||
*/
|
*/
|
||||||
static int bpq_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
static int bpq_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
|
||||||
|
void __user *data, int cmd)
|
||||||
{
|
{
|
||||||
struct bpq_ethaddr __user *ethaddr = ifr->ifr_data;
|
struct bpq_ethaddr __user *ethaddr = data;
|
||||||
struct bpqdev *bpq = netdev_priv(dev);
|
struct bpqdev *bpq = netdev_priv(dev);
|
||||||
struct bpq_req req;
|
struct bpq_req req;
|
||||||
|
|
||||||
@ -325,7 +326,7 @@ static int bpq_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SIOCSBPQETHOPT:
|
case SIOCSBPQETHOPT:
|
||||||
if (copy_from_user(&req, ifr->ifr_data, sizeof(struct bpq_req)))
|
if (copy_from_user(&req, data, sizeof(struct bpq_req)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
switch (req.cmd) {
|
switch (req.cmd) {
|
||||||
case SIOCGBPQETHPARAM:
|
case SIOCGBPQETHPARAM:
|
||||||
@ -448,7 +449,7 @@ static const struct net_device_ops bpq_netdev_ops = {
|
|||||||
.ndo_stop = bpq_close,
|
.ndo_stop = bpq_close,
|
||||||
.ndo_start_xmit = bpq_xmit,
|
.ndo_start_xmit = bpq_xmit,
|
||||||
.ndo_set_mac_address = bpq_set_mac_address,
|
.ndo_set_mac_address = bpq_set_mac_address,
|
||||||
.ndo_do_ioctl = bpq_ioctl,
|
.ndo_siocdevprivate = bpq_siocdevprivate,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void bpq_setup(struct net_device *dev)
|
static void bpq_setup(struct net_device *dev)
|
||||||
|
@ -225,7 +225,8 @@ static int read_scc_data(struct scc_priv *priv);
|
|||||||
|
|
||||||
static int scc_open(struct net_device *dev);
|
static int scc_open(struct net_device *dev);
|
||||||
static int scc_close(struct net_device *dev);
|
static int scc_close(struct net_device *dev);
|
||||||
static int scc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
|
static int scc_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
|
||||||
|
void __user *data, int cmd);
|
||||||
static int scc_send_packet(struct sk_buff *skb, struct net_device *dev);
|
static int scc_send_packet(struct sk_buff *skb, struct net_device *dev);
|
||||||
static int scc_set_mac_address(struct net_device *dev, void *sa);
|
static int scc_set_mac_address(struct net_device *dev, void *sa);
|
||||||
|
|
||||||
@ -432,7 +433,7 @@ static const struct net_device_ops scc_netdev_ops = {
|
|||||||
.ndo_open = scc_open,
|
.ndo_open = scc_open,
|
||||||
.ndo_stop = scc_close,
|
.ndo_stop = scc_close,
|
||||||
.ndo_start_xmit = scc_send_packet,
|
.ndo_start_xmit = scc_send_packet,
|
||||||
.ndo_do_ioctl = scc_ioctl,
|
.ndo_siocdevprivate = scc_siocdevprivate,
|
||||||
.ndo_set_mac_address = scc_set_mac_address,
|
.ndo_set_mac_address = scc_set_mac_address,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -881,15 +882,13 @@ static int scc_close(struct net_device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int scc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
static int scc_siocdevprivate(struct net_device *dev, struct ifreq *ifr, void __user *data, int cmd)
|
||||||
{
|
{
|
||||||
struct scc_priv *priv = dev->ml_priv;
|
struct scc_priv *priv = dev->ml_priv;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SIOCGSCCPARAM:
|
case SIOCGSCCPARAM:
|
||||||
if (copy_to_user
|
if (copy_to_user(data, &priv->param, sizeof(struct scc_param)))
|
||||||
(ifr->ifr_data, &priv->param,
|
|
||||||
sizeof(struct scc_param)))
|
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
case SIOCSSCCPARAM:
|
case SIOCSSCCPARAM:
|
||||||
@ -897,13 +896,12 @@ static int scc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
return -EPERM;
|
return -EPERM;
|
||||||
if (netif_running(dev))
|
if (netif_running(dev))
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
if (copy_from_user
|
if (copy_from_user(&priv->param, data,
|
||||||
(&priv->param, ifr->ifr_data,
|
sizeof(struct scc_param)))
|
||||||
sizeof(struct scc_param)))
|
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -483,23 +483,25 @@ static int hdlcdrv_close(struct net_device *dev)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int hdlcdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
static int hdlcdrv_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
|
||||||
|
void __user *data, int cmd)
|
||||||
{
|
{
|
||||||
struct hdlcdrv_state *s = netdev_priv(dev);
|
struct hdlcdrv_state *s = netdev_priv(dev);
|
||||||
struct hdlcdrv_ioctl bi;
|
struct hdlcdrv_ioctl bi;
|
||||||
|
|
||||||
if (cmd != SIOCDEVPRIVATE) {
|
if (cmd != SIOCDEVPRIVATE)
|
||||||
if (s->ops && s->ops->ioctl)
|
|
||||||
return s->ops->ioctl(dev, ifr, &bi, cmd);
|
|
||||||
return -ENOIOCTLCMD;
|
return -ENOIOCTLCMD;
|
||||||
}
|
|
||||||
if (copy_from_user(&bi, ifr->ifr_data, sizeof(bi)))
|
if (in_compat_syscall()) /* to be implemented */
|
||||||
|
return -ENOIOCTLCMD;
|
||||||
|
|
||||||
|
if (copy_from_user(&bi, data, sizeof(bi)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
switch (bi.cmd) {
|
switch (bi.cmd) {
|
||||||
default:
|
default:
|
||||||
if (s->ops && s->ops->ioctl)
|
if (s->ops && s->ops->ioctl)
|
||||||
return s->ops->ioctl(dev, ifr, &bi, cmd);
|
return s->ops->ioctl(dev, data, &bi, cmd);
|
||||||
return -ENOIOCTLCMD;
|
return -ENOIOCTLCMD;
|
||||||
|
|
||||||
case HDLCDRVCTL_GETCHANNELPAR:
|
case HDLCDRVCTL_GETCHANNELPAR:
|
||||||
@ -605,7 +607,7 @@ static int hdlcdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (copy_to_user(ifr->ifr_data, &bi, sizeof(bi)))
|
if (copy_to_user(data, &bi, sizeof(bi)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -617,7 +619,7 @@ static const struct net_device_ops hdlcdrv_netdev = {
|
|||||||
.ndo_open = hdlcdrv_open,
|
.ndo_open = hdlcdrv_open,
|
||||||
.ndo_stop = hdlcdrv_close,
|
.ndo_stop = hdlcdrv_close,
|
||||||
.ndo_start_xmit = hdlcdrv_send_packet,
|
.ndo_start_xmit = hdlcdrv_send_packet,
|
||||||
.ndo_do_ioctl = hdlcdrv_ioctl,
|
.ndo_siocdevprivate = hdlcdrv_siocdevprivate,
|
||||||
.ndo_set_mac_address = hdlcdrv_set_mac_address,
|
.ndo_set_mac_address = hdlcdrv_set_mac_address,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -210,7 +210,8 @@ static int scc_net_close(struct net_device *dev);
|
|||||||
static void scc_net_rx(struct scc_channel *scc, struct sk_buff *skb);
|
static void scc_net_rx(struct scc_channel *scc, struct sk_buff *skb);
|
||||||
static netdev_tx_t scc_net_tx(struct sk_buff *skb,
|
static netdev_tx_t scc_net_tx(struct sk_buff *skb,
|
||||||
struct net_device *dev);
|
struct net_device *dev);
|
||||||
static int scc_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
|
static int scc_net_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
|
||||||
|
void __user *data, int cmd);
|
||||||
static int scc_net_set_mac_address(struct net_device *dev, void *addr);
|
static int scc_net_set_mac_address(struct net_device *dev, void *addr);
|
||||||
static struct net_device_stats * scc_net_get_stats(struct net_device *dev);
|
static struct net_device_stats * scc_net_get_stats(struct net_device *dev);
|
||||||
|
|
||||||
@ -1550,7 +1551,7 @@ static const struct net_device_ops scc_netdev_ops = {
|
|||||||
.ndo_start_xmit = scc_net_tx,
|
.ndo_start_xmit = scc_net_tx,
|
||||||
.ndo_set_mac_address = scc_net_set_mac_address,
|
.ndo_set_mac_address = scc_net_set_mac_address,
|
||||||
.ndo_get_stats = scc_net_get_stats,
|
.ndo_get_stats = scc_net_get_stats,
|
||||||
.ndo_do_ioctl = scc_net_ioctl,
|
.ndo_siocdevprivate = scc_net_siocdevprivate,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ----> Initialize device <----- */
|
/* ----> Initialize device <----- */
|
||||||
@ -1703,7 +1704,8 @@ static netdev_tx_t scc_net_tx(struct sk_buff *skb, struct net_device *dev)
|
|||||||
* SIOCSCCCAL - send calib. pattern arg: (struct scc_calibrate *) arg
|
* SIOCSCCCAL - send calib. pattern arg: (struct scc_calibrate *) arg
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int scc_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
static int scc_net_siocdevprivate(struct net_device *dev,
|
||||||
|
struct ifreq *ifr, void __user *arg, int cmd)
|
||||||
{
|
{
|
||||||
struct scc_kiss_cmd kiss_cmd;
|
struct scc_kiss_cmd kiss_cmd;
|
||||||
struct scc_mem_config memcfg;
|
struct scc_mem_config memcfg;
|
||||||
@ -1712,8 +1714,6 @@ static int scc_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
struct scc_channel *scc = (struct scc_channel *) dev->ml_priv;
|
struct scc_channel *scc = (struct scc_channel *) dev->ml_priv;
|
||||||
int chan;
|
int chan;
|
||||||
unsigned char device_name[IFNAMSIZ];
|
unsigned char device_name[IFNAMSIZ];
|
||||||
void __user *arg = ifr->ifr_data;
|
|
||||||
|
|
||||||
|
|
||||||
if (!Driver_Initialized)
|
if (!Driver_Initialized)
|
||||||
{
|
{
|
||||||
@ -1722,6 +1722,9 @@ static int scc_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
int found = 1;
|
int found = 1;
|
||||||
|
|
||||||
if (!capable(CAP_SYS_RAWIO)) return -EPERM;
|
if (!capable(CAP_SYS_RAWIO)) return -EPERM;
|
||||||
|
if (in_compat_syscall())
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
if (!arg) return -EFAULT;
|
if (!arg) return -EFAULT;
|
||||||
|
|
||||||
if (Nchips >= SCC_MAXCHIPS)
|
if (Nchips >= SCC_MAXCHIPS)
|
||||||
|
@ -920,15 +920,15 @@ static int yam_close(struct net_device *dev)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
static int yam_siocdevprivate(struct net_device *dev, struct ifreq *ifr, void __user *data, int cmd)
|
||||||
{
|
{
|
||||||
struct yam_port *yp = netdev_priv(dev);
|
struct yam_port *yp = netdev_priv(dev);
|
||||||
struct yamdrv_ioctl_cfg yi;
|
struct yamdrv_ioctl_cfg yi;
|
||||||
struct yamdrv_ioctl_mcs *ym;
|
struct yamdrv_ioctl_mcs *ym;
|
||||||
int ioctl_cmd;
|
int ioctl_cmd;
|
||||||
|
|
||||||
if (copy_from_user(&ioctl_cmd, ifr->ifr_data, sizeof(int)))
|
if (copy_from_user(&ioctl_cmd, data, sizeof(int)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (yp->magic != YAM_MAGIC)
|
if (yp->magic != YAM_MAGIC)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -947,8 +947,7 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
case SIOCYAMSMCS:
|
case SIOCYAMSMCS:
|
||||||
if (netif_running(dev))
|
if (netif_running(dev))
|
||||||
return -EINVAL; /* Cannot change this parameter when up */
|
return -EINVAL; /* Cannot change this parameter when up */
|
||||||
ym = memdup_user(ifr->ifr_data,
|
ym = memdup_user(data, sizeof(struct yamdrv_ioctl_mcs));
|
||||||
sizeof(struct yamdrv_ioctl_mcs));
|
|
||||||
if (IS_ERR(ym))
|
if (IS_ERR(ym))
|
||||||
return PTR_ERR(ym);
|
return PTR_ERR(ym);
|
||||||
if (ym->cmd != SIOCYAMSMCS)
|
if (ym->cmd != SIOCYAMSMCS)
|
||||||
@ -965,8 +964,8 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
case SIOCYAMSCFG:
|
case SIOCYAMSCFG:
|
||||||
if (!capable(CAP_SYS_RAWIO))
|
if (!capable(CAP_SYS_RAWIO))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
if (copy_from_user(&yi, ifr->ifr_data, sizeof(struct yamdrv_ioctl_cfg)))
|
if (copy_from_user(&yi, data, sizeof(struct yamdrv_ioctl_cfg)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (yi.cmd != SIOCYAMSCFG)
|
if (yi.cmd != SIOCYAMSCFG)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -1045,8 +1044,8 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||||||
yi.cfg.txtail = yp->txtail;
|
yi.cfg.txtail = yp->txtail;
|
||||||
yi.cfg.persist = yp->pers;
|
yi.cfg.persist = yp->pers;
|
||||||
yi.cfg.slottime = yp->slot;
|
yi.cfg.slottime = yp->slot;
|
||||||
if (copy_to_user(ifr->ifr_data, &yi, sizeof(struct yamdrv_ioctl_cfg)))
|
if (copy_to_user(data, &yi, sizeof(struct yamdrv_ioctl_cfg)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1074,7 +1073,7 @@ static const struct net_device_ops yam_netdev_ops = {
|
|||||||
.ndo_open = yam_open,
|
.ndo_open = yam_open,
|
||||||
.ndo_stop = yam_close,
|
.ndo_stop = yam_close,
|
||||||
.ndo_start_xmit = yam_send_packet,
|
.ndo_start_xmit = yam_send_packet,
|
||||||
.ndo_do_ioctl = yam_ioctl,
|
.ndo_siocdevprivate = yam_siocdevprivate,
|
||||||
.ndo_set_mac_address = yam_set_mac_address,
|
.ndo_set_mac_address = yam_set_mac_address,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ struct hdlcdrv_ops {
|
|||||||
*/
|
*/
|
||||||
int (*open)(struct net_device *);
|
int (*open)(struct net_device *);
|
||||||
int (*close)(struct net_device *);
|
int (*close)(struct net_device *);
|
||||||
int (*ioctl)(struct net_device *, struct ifreq *,
|
int (*ioctl)(struct net_device *, void __user *,
|
||||||
struct hdlcdrv_ioctl *, int);
|
struct hdlcdrv_ioctl *, int);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user