diff options
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 22 |
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 *)) | |||
941 | EXPORT_SYMBOL(dlci_ioctl_set); | 941 | EXPORT_SYMBOL(dlci_ioctl_set); |
942 | 942 | ||
943 | static long sock_do_ioctl(struct net *net, struct socket *sock, | 943 | static 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 | ||
3078 | out: | 3083 | out: |
@@ -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; |