Commit 25ec92fb authored by Arnd Bergmann's avatar Arnd Bergmann Committed by David S. Miller

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: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ebb4a911
...@@ -1005,7 +1005,8 @@ static int baycom_setmode(struct baycom_state *bc, const char *modestr) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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); ...@@ -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 = { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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); ...@@ -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 = { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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 { ...@@ -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);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment