summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorHarout Hedeshian <harouth@codeaurora.org>2014-02-03 11:26:41 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 11:05:08 -0700
commit3988539fdd553115f85bf21243904f4e6d2fcc4c (patch)
treee6616d6203aada67ddc3a7c634ab22c113bec52c /net
parenta207285d7f53efab18001d0ca7ce9accef94d10c (diff)
net: rmnet_data: new structure for rmnet ioctls
This patch modifies the rmnet ioctls RMNET_IOCTL_GET_LLP, RMNET_IOCTL_GET_QOS, RMNET_IOCTL_GET_OPMODE, RMNET_IOCTL_FLOW_ENABLE and RMNET_IOCTL_FLOW_DISABLE to avoid putting integral data in pointers and avoid casting between 32 and 64 bits types. CRs-Fixed: 601207 Change-Id: I66edb785f6204f38b6f0ecccb2ceab36d5e38188 Acked-by: Sivan Reinstein <sivanr@qti.qualcomm.com> Signed-off-by: Harout Hedeshian <harouth@codeaurora.org> [subashab@codeaurora.org: remove driver specific changes] Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Diffstat (limited to 'net')
-rw-r--r--net/rmnet_data/rmnet_data_vnd.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/net/rmnet_data/rmnet_data_vnd.c b/net/rmnet_data/rmnet_data_vnd.c
index 1c6a950740ea..e1e57a3845e1 100644
--- a/net/rmnet_data/rmnet_data_vnd.c
+++ b/net/rmnet_data/rmnet_data_vnd.c
@@ -212,6 +212,7 @@ static int _rmnet_vnd_do_qos_ioctl(struct net_device *dev,
{
struct rmnet_vnd_private_s *dev_conf;
int rc;
+ struct rmnet_ioctl_data_s ioctl_data;
rc = 0;
dev_conf = (struct rmnet_vnd_private_s *) netdev_priv(dev);
@@ -230,18 +231,31 @@ static int _rmnet_vnd_do_qos_ioctl(struct net_device *dev,
case RMNET_IOCTL_GET_QOS: /* Get QoS header state */
LOGM("RMNET_IOCTL_GET_QOS on %s", dev->name);
- ifr->ifr_ifru.ifru_data =
- (void *)(dev_conf->qos_version == RMNET_IOCTL_QOS_MODE_6);
+ ioctl_data.u.operation_mode = (dev_conf->qos_version ==
+ RMNET_IOCTL_QOS_MODE_6);
+ if (copy_to_user(ifr->ifr_ifru.ifru_data, &ioctl_data,
+ sizeof(struct rmnet_ioctl_data_s)))
+ rc = -EFAULT;
break;
case RMNET_IOCTL_FLOW_ENABLE:
LOGL("RMNET_IOCTL_FLOW_ENABLE on %s", dev->name);
- tc_qdisc_flow_control(dev, (u32)ifr->ifr_data, 1);
+ if (copy_from_user(&ioctl_data, ifr->ifr_ifru.ifru_data,
+ sizeof(struct rmnet_ioctl_data_s))) {
+ rc = -EFAULT;
+ break;
+ }
+ tc_qdisc_flow_control(dev, ioctl_data.u.tcm_handle, 1);
break;
case RMNET_IOCTL_FLOW_DISABLE:
LOGL("RMNET_IOCTL_FLOW_DISABLE on %s", dev->name);
- tc_qdisc_flow_control(dev, (u32)ifr->ifr_data, 0);
+ if (copy_from_user(&ioctl_data, ifr->ifr_ifru.ifru_data,
+ sizeof(struct rmnet_ioctl_data_s))) {
+ rc = -EFAULT;
+ break;
+ }
+ tc_qdisc_flow_control(dev, ioctl_data.u.tcm_handle, 0);
break;
default:
@@ -387,6 +401,7 @@ static int rmnet_vnd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
struct rmnet_vnd_private_s *dev_conf;
int rc;
+ struct rmnet_ioctl_data_s ioctl_data;
rc = 0;
dev_conf = (struct rmnet_vnd_private_s *) netdev_priv(dev);
@@ -417,7 +432,10 @@ static int rmnet_vnd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
case RMNET_IOCTL_GET_LLP: /* Always return IP mode */
LOGM("RMNET_IOCTL_GET_LLP on %s", dev->name);
- ifr->ifr_ifru.ifru_data = (void *)(RMNET_MODE_LLP_IP);
+ ioctl_data.u.operation_mode = RMNET_MODE_LLP_IP;
+ if (copy_to_user(ifr->ifr_ifru.ifru_data, &ioctl_data,
+ sizeof(struct rmnet_ioctl_data_s)))
+ rc = -EFAULT;
break;
case RMNET_IOCTL_EXTENDED: