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

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
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -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 hdlcdrv_ioctl hi;
@@ -1013,7 +1014,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
	if (cmd != SIOCDEVPRIVATE)
		return -ENOIOCTLCMD;

	if (copy_from_user(&hi, ifr->ifr_data, sizeof(hi)))
	if (copy_from_user(&hi, data, sizeof(hi)))
		return -EFAULT;
	switch (hi.cmd) {
	default:
@@ -1104,7 +1105,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
		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 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 = {
	.ndo_open	     = epp_open,
	.ndo_stop	     = epp_close,
	.ndo_do_ioctl	     = baycom_ioctl,
	.ndo_siocdevprivate  = baycom_siocdevprivate,
	.ndo_start_xmit      = baycom_send_packet,
	.ndo_set_mac_address = baycom_set_mac_address,
};
+6 −6
Original line number Diff line number Diff line
@@ -380,7 +380,7 @@ static int par96_close(struct net_device *dev)
 * ===================== 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);

/* --------------------------------------------------------------------- */
@@ -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 baycom_state *bc;
@@ -428,7 +428,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,

	case HDLCDRVCTL_GETMODE:
		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 0;

@@ -440,7 +440,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,

	case HDLCDRVCTL_MODELIST:
		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 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;
	switch (bi.cmd) {
	default:
@@ -464,7 +464,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
#endif /* BAYCOM_DEBUG */

	}
	if (copy_to_user(ifr->ifr_data, &bi, sizeof(bi)))
	if (copy_to_user(data, &bi, sizeof(bi)))
		return -EFAULT;
	return 0;

+6 −6
Original line number Diff line number Diff line
@@ -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);

/* --------------------------------------------------------------------- */
@@ -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 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);
		if (bc->opt_dcd <= 0)
			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 0;

@@ -531,7 +531,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,

	case HDLCDRVCTL_MODELIST:
		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 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;
	switch (bi.cmd) {
	default:
@@ -555,7 +555,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
#endif /* BAYCOM_DEBUG */

	}
	if (copy_to_user(ifr->ifr_data, &bi, sizeof(bi)))
	if (copy_to_user(data, &bi, sizeof(bi)))
		return -EFAULT;
	return 0;

+6 −6
Original line number Diff line number Diff line
@@ -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);

/* --------------------------------------------------------------------- */
@@ -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 baycom_state *bc;
@@ -573,7 +573,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
		strcpy(hi->data.modename, "ser12");
		if (bc->opt_dcd <= 0)
			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 0;

@@ -585,7 +585,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,

	case HDLCDRVCTL_MODELIST:
		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 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;
	switch (bi.cmd) {
	default:
@@ -609,7 +609,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
#endif /* BAYCOM_DEBUG */

	}
	if (copy_to_user(ifr->ifr_data, &bi, sizeof(bi)))
	if (copy_to_user(data, &bi, sizeof(bi)))
		return -EFAULT;
	return 0;

+5 −4
Original line number Diff line number Diff line
@@ -314,9 +314,10 @@ static int bpq_set_mac_address(struct net_device *dev, void *addr)
 *					source ethernet address (broadcast
 *					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 bpq_req req;

@@ -325,7 +326,7 @@ static int bpq_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)

	switch (cmd) {
		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;
			switch (req.cmd) {
				case SIOCGBPQETHPARAM:
@@ -448,7 +449,7 @@ static const struct net_device_ops bpq_netdev_ops = {
	.ndo_stop	     = bpq_close,
	.ndo_start_xmit	     = bpq_xmit,
	.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)
Loading