aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/net/socket.c b/net/socket.c
index e6945e318f02..01f3f8f32d6f 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -941,7 +941,8 @@ void dlci_ioctl_set(int (*hook) (unsigned int, void __user *))
941EXPORT_SYMBOL(dlci_ioctl_set); 941EXPORT_SYMBOL(dlci_ioctl_set);
942 942
943static long sock_do_ioctl(struct net *net, struct socket *sock, 943static long sock_do_ioctl(struct net *net, struct socket *sock,
944 unsigned int cmd, unsigned long arg) 944 unsigned int cmd, unsigned long arg,
945 unsigned int ifreq_size)
945{ 946{
946 int err; 947 int err;
947 void __user *argp = (void __user *)arg; 948 void __user *argp = (void __user *)arg;
@@ -967,11 +968,11 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
967 } else { 968 } else {
968 struct ifreq ifr; 969 struct ifreq ifr;
969 bool need_copyout; 970 bool need_copyout;
970 if (copy_from_user(&ifr, argp, sizeof(struct ifreq))) 971 if (copy_from_user(&ifr, argp, ifreq_size))
971 return -EFAULT; 972 return -EFAULT;
972 err = dev_ioctl(net, cmd, &ifr, &need_copyout); 973 err = dev_ioctl(net, cmd, &ifr, &need_copyout);
973 if (!err && need_copyout) 974 if (!err && need_copyout)
974 if (copy_to_user(argp, &ifr, sizeof(struct ifreq))) 975 if (copy_to_user(argp, &ifr, ifreq_size))
975 return -EFAULT; 976 return -EFAULT;
976 } 977 }
977 return err; 978 return err;
@@ -1070,7 +1071,8 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
1070 err = open_related_ns(&net->ns, get_net_ns); 1071 err = open_related_ns(&net->ns, get_net_ns);
1071 break; 1072 break;
1072 default: 1073 default:
1073 err = sock_do_ioctl(net, sock, cmd, arg); 1074 err = sock_do_ioctl(net, sock, cmd, arg,
1075 sizeof(struct ifreq));
1074 break; 1076 break;
1075 } 1077 }
1076 return err; 1078 return err;
@@ -2750,7 +2752,8 @@ static int do_siocgstamp(struct net *net, struct socket *sock,
2750 int err; 2752 int err;
2751 2753
2752 set_fs(KERNEL_DS); 2754 set_fs(KERNEL_DS);
2753 err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv); 2755 err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv,
2756 sizeof(struct compat_ifreq));
2754 set_fs(old_fs); 2757 set_fs(old_fs);
2755 if (!err) 2758 if (!err)
2756 err = compat_put_timeval(&ktv, up); 2759 err = compat_put_timeval(&ktv, up);
@@ -2766,7 +2769,8 @@ static int do_siocgstampns(struct net *net, struct socket *sock,
2766 int err; 2769 int err;
2767 2770
2768 set_fs(KERNEL_DS); 2771 set_fs(KERNEL_DS);
2769 err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts); 2772 err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts,
2773 sizeof(struct compat_ifreq));
2770 set_fs(old_fs); 2774 set_fs(old_fs);
2771 if (!err) 2775 if (!err)
2772 err = compat_put_timespec(&kts, up); 2776 err = compat_put_timespec(&kts, up);
@@ -3072,7 +3076,8 @@ static int routing_ioctl(struct net *net, struct socket *sock,
3072 } 3076 }
3073 3077
3074 set_fs(KERNEL_DS); 3078 set_fs(KERNEL_DS);
3075 ret = sock_do_ioctl(net, sock, cmd, (unsigned long) r); 3079 ret = sock_do_ioctl(net, sock, cmd, (unsigned long) r,
3080 sizeof(struct compat_ifreq));
3076 set_fs(old_fs); 3081 set_fs(old_fs);
3077 3082
3078out: 3083out:
@@ -3185,7 +3190,8 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
3185 case SIOCBONDSETHWADDR: 3190 case SIOCBONDSETHWADDR:
3186 case SIOCBONDCHANGEACTIVE: 3191 case SIOCBONDCHANGEACTIVE:
3187 case SIOCGIFNAME: 3192 case SIOCGIFNAME:
3188 return sock_do_ioctl(net, sock, cmd, arg); 3193 return sock_do_ioctl(net, sock, cmd, arg,
3194 sizeof(struct compat_ifreq));
3189 } 3195 }
3190 3196
3191 return -ENOIOCTLCMD; 3197 return -ENOIOCTLCMD;