aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2014-12-16 08:04:56 -0500
committerDavid S. Miller <davem@davemloft.net>2014-12-16 11:19:41 -0500
commit39ec7de7092ba9789f211d112a66bd19d4cb5d36 (patch)
treedfa9725a4c54e900c9a60999f29b0f65b72f96fd /drivers/net
parentc286bbaf4f56958db2591146145e248c7b9021c5 (diff)
macvtap: fix uninitialized access on TUNSETIFF
flags field in ifreq is only 16 bit wide, but we read it as a 32 bit value. If userspace doesn't zero-initialize unused fields, this will lead to failures. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/macvtap.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 60f7ee5fafbe..80fdb82352fa 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -999,7 +999,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
999 void __user *argp = (void __user *)arg; 999 void __user *argp = (void __user *)arg;
1000 struct ifreq __user *ifr = argp; 1000 struct ifreq __user *ifr = argp;
1001 unsigned int __user *up = argp; 1001 unsigned int __user *up = argp;
1002 unsigned int u; 1002 unsigned short u;
1003 int __user *sp = argp; 1003 int __user *sp = argp;
1004 int s; 1004 int s;
1005 int ret; 1005 int ret;
@@ -1014,7 +1014,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
1014 if ((u & ~MACVTAP_FEATURES) != (IFF_NO_PI | IFF_TAP)) 1014 if ((u & ~MACVTAP_FEATURES) != (IFF_NO_PI | IFF_TAP))
1015 ret = -EINVAL; 1015 ret = -EINVAL;
1016 else 1016 else
1017 q->flags = u; 1017 q->flags = (q->flags & ~MACVTAP_FEATURES) | u;
1018 1018
1019 return ret; 1019 return ret;
1020 1020
@@ -1027,8 +1027,9 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
1027 } 1027 }
1028 1028
1029 ret = 0; 1029 ret = 0;
1030 u = q->flags;
1030 if (copy_to_user(&ifr->ifr_name, vlan->dev->name, IFNAMSIZ) || 1031 if (copy_to_user(&ifr->ifr_name, vlan->dev->name, IFNAMSIZ) ||
1031 put_user(q->flags, &ifr->ifr_flags)) 1032 put_user(u, &ifr->ifr_flags))
1032 ret = -EFAULT; 1033 ret = -EFAULT;
1033 macvtap_put_vlan(vlan); 1034 macvtap_put_vlan(vlan);
1034 rtnl_unlock(); 1035 rtnl_unlock();