Skip to content

Commit

Permalink
slip/plip: use ndo_siocdevprivate
Browse files Browse the repository at this point in the history
slip and plip both use a couple of SIOCDEVPRIVATE ioctl
commands that overload the ifreq layout in a way that is
incompatible with compat mode.

Convert to use ndo_siocdevprivate to allow passing the
data this way, but return an error in compat mode anyway
because the private structure is still incompatible.

This could be fixed as well to make compat work properly.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Arnd Bergmann authored and David S. Miller committed Jul 27, 2021
1 parent ef1b5b0 commit 76b5878
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
12 changes: 9 additions & 3 deletions drivers/net/plip/plip.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ static const char version[] = "NET3 PLIP version 2.4-parport gniibe@mri.co.jp\n"
extra grounds are 18,19,20,21,22,23,24
*/

#include <linux/compat.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
Expand Down Expand Up @@ -150,7 +151,8 @@ static int plip_hard_header_cache(const struct neighbour *neigh,
struct hh_cache *hh, __be16 type);
static int plip_open(struct net_device *dev);
static int plip_close(struct net_device *dev);
static int plip_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
static int plip_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
void __user *data, int cmd);
static int plip_preempt(void *handle);
static void plip_wakeup(void *handle);

Expand Down Expand Up @@ -265,7 +267,7 @@ static const struct net_device_ops plip_netdev_ops = {
.ndo_open = plip_open,
.ndo_stop = plip_close,
.ndo_start_xmit = plip_tx_packet,
.ndo_do_ioctl = plip_ioctl,
.ndo_siocdevprivate = plip_siocdevprivate,
.ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr,
};
Expand Down Expand Up @@ -1207,14 +1209,18 @@ plip_wakeup(void *handle)
}

static int
plip_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
plip_siocdevprivate(struct net_device *dev, struct ifreq *rq,
void __user *data, int cmd)
{
struct net_local *nl = netdev_priv(dev);
struct plipconf *pc = (struct plipconf *) &rq->ifr_ifru;

if (cmd != SIOCDEVPLIP)
return -EOPNOTSUPP;

if (in_compat_syscall())
return -EOPNOTSUPP;

switch(pc->pcmd) {
case PLIP_GET_TIMEOUT:
pc->trigger = nl->trigger;
Expand Down
13 changes: 9 additions & 4 deletions drivers/net/slip/slip.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
*/

#define SL_CHECK_TRANSMIT
#include <linux/compat.h>
#include <linux/module.h>
#include <linux/moduleparam.h>

Expand Down Expand Up @@ -108,7 +109,7 @@ static void slip_unesc6(struct slip *sl, unsigned char c);
#ifdef CONFIG_SLIP_SMART
static void sl_keepalive(struct timer_list *t);
static void sl_outfill(struct timer_list *t);
static int sl_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
static int sl_siocdevprivate(struct net_device *dev, struct ifreq *rq, void __user *data, int cmd);
#endif

/********************************
Expand Down Expand Up @@ -647,7 +648,7 @@ static const struct net_device_ops sl_netdev_ops = {
.ndo_change_mtu = sl_change_mtu,
.ndo_tx_timeout = sl_tx_timeout,
#ifdef CONFIG_SLIP_SMART
.ndo_do_ioctl = sl_ioctl,
.ndo_siocdevprivate = sl_siocdevprivate,
#endif
};

Expand Down Expand Up @@ -1179,18 +1180,22 @@ static int slip_ioctl(struct tty_struct *tty, struct file *file,

/* VSV changes start here */
#ifdef CONFIG_SLIP_SMART
/* function do_ioctl called from net/core/dev.c
/* function sl_siocdevprivate called from net/core/dev.c
to allow get/set outfill/keepalive parameter
by ifconfig */

static int sl_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
static int sl_siocdevprivate(struct net_device *dev, struct ifreq *rq,
void __user *data, int cmd)
{
struct slip *sl = netdev_priv(dev);
unsigned long *p = (unsigned long *)&rq->ifr_ifru;

if (sl == NULL) /* Allocation failed ?? */
return -ENODEV;

if (in_compat_syscall())
return -EOPNOTSUPP;

spin_lock_bh(&sl->lock);

if (!sl->tty) {
Expand Down

0 comments on commit 76b5878

Please sign in to comment.