mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
net: bridge: Get SIOCGIFBR/SIOCSIFBR ioctl working in compat mode
In compat mode SIOC{G,S}IFBR ioctls were only supporting BRCTL_GET_VERSION returning an artificially version to spur userland tool to use SIOCDEVPRIVATE instead. But some userland tools ignore that and use SIOC{G,S}IFBR unconditionally as seen with busybox's brctl. Example of non working 32-bit brctl with CONFIG_COMPAT=y: $ brctl show brctl: SIOCGIFBR: Invalid argument Example of fixed 32-bit brctl with CONFIG_COMPAT=y: $ brctl show bridge name bridge id STP enabled interfaces br0 Signed-off-by: Remi Pommarel <repk@triplefau.lt> Co-developed-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
32f52e8e78
commit
fd3a459000
20
net/socket.c
20
net/socket.c
@@ -3233,21 +3233,6 @@ static int compat_ifr_data_ioctl(struct net *net, unsigned int cmd,
|
||||
return dev_ioctl(net, cmd, &ifreq, data, NULL);
|
||||
}
|
||||
|
||||
/* Since old style bridge ioctl's endup using SIOCDEVPRIVATE
|
||||
* for some operations; this forces use of the newer bridge-utils that
|
||||
* use compatible ioctls
|
||||
*/
|
||||
static int old_bridge_ioctl(compat_ulong_t __user *argp)
|
||||
{
|
||||
compat_ulong_t tmp;
|
||||
|
||||
if (get_user(tmp, argp))
|
||||
return -EFAULT;
|
||||
if (tmp == BRCTL_GET_VERSION)
|
||||
return BRCTL_VERSION + 1;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
@@ -3259,9 +3244,6 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
|
||||
return sock_ioctl(file, cmd, (unsigned long)argp);
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSIFBR:
|
||||
case SIOCGIFBR:
|
||||
return old_bridge_ioctl(argp);
|
||||
case SIOCWANDEV:
|
||||
return compat_siocwandev(net, argp);
|
||||
case SIOCGSTAMP_OLD:
|
||||
@@ -3290,6 +3272,8 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
|
||||
case SIOCGSTAMP_NEW:
|
||||
case SIOCGSTAMPNS_NEW:
|
||||
case SIOCGIFCONF:
|
||||
case SIOCSIFBR:
|
||||
case SIOCGIFBR:
|
||||
return sock_ioctl(file, cmd, arg);
|
||||
|
||||
case SIOCGIFFLAGS:
|
||||
|
Reference in New Issue
Block a user