To avoid overwriting the upper bits of the flags, commit 39ec7de7092b ("macvtap: fix uninitialized access on TUNSETIFF") changed the variable u from unsigned int to unsigned short and added some ORing logic for the flags. This introduced at least one regression: - TUNSETSNDBUF supports int as its size and also uses the now short u as buffer - this breaks any sendbuf size > 64k Let's change u back to unsigned int, keep the ORing and handle the overwrite issue with casts and masking. Cc: Michael S. Tsirkin <mst@xxxxxxxxxx> Cc: David S. Miller <davem@xxxxxxxxxxxxx> Reported-by: Mark A. Peloquin Bisected-by: Matthew Rosato <mjrosato@xxxxxxxxxxxxxxxxxx> Signed-off-by: Christian Borntraeger <borntraeger@xxxxxxxxxx> Fixes: 39ec7de7092b ("macvtap: fix uninitialized access on TUNSETIFF") Cc: stable@xxxxxxxxxxxxxxx --- drivers/net/macvtap.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index edd7734..c33fe41 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c @@ -1060,7 +1060,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd, void __user *argp = (void __user *)arg; struct ifreq __user *ifr = argp; unsigned int __user *up = argp; - unsigned short u; + unsigned int u; int __user *sp = argp; struct sockaddr sa; int s; @@ -1076,7 +1076,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd, if ((u & ~MACVTAP_FEATURES) != (IFF_NO_PI | IFF_TAP)) ret = -EINVAL; else - q->flags = (q->flags & ~MACVTAP_FEATURES) | u; + q->flags = (q->flags & ~MACVTAP_FEATURES) | (short) u; return ret; @@ -1089,9 +1089,8 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd, } ret = 0; - u = q->flags; if (copy_to_user(&ifr->ifr_name, vlan->dev->name, IFNAMSIZ) || - put_user(u, &ifr->ifr_flags)) + put_user((short) q->flags, &ifr->ifr_flags)) ret = -EFAULT; macvtap_put_vlan(vlan); rtnl_unlock(); -- 2.3.0 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html