Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net/compat: Merge multiple implementations of ifreq::ifr_data conversion

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>

+6 -43
+6 -43
net/socket.c
··· 2964 2964 struct compat_ifreq __user *ifr32) 2965 2965 { 2966 2966 struct ifreq kifr; 2967 - struct ifreq __user *uifr; 2968 2967 mm_segment_t old_fs; 2969 2968 int err; 2970 - u32 data; 2971 - void __user *datap; 2972 2969 2973 2970 switch (cmd) { 2974 2971 case SIOCBONDENSLAVE: ··· 2982 2985 set_fs(old_fs); 2983 2986 2984 2987 return err; 2985 - case SIOCBONDSLAVEINFOQUERY: 2986 - case SIOCBONDINFOQUERY: 2987 - uifr = compat_alloc_user_space(sizeof(*uifr)); 2988 - if (copy_in_user(&uifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ)) 2989 - return -EFAULT; 2990 - 2991 - if (get_user(data, &ifr32->ifr_ifru.ifru_data)) 2992 - return -EFAULT; 2993 - 2994 - datap = compat_ptr(data); 2995 - if (put_user(datap, &uifr->ifr_ifru.ifru_data)) 2996 - return -EFAULT; 2997 - 2998 - return dev_ioctl(net, cmd, uifr); 2999 2988 default: 3000 2989 return -ENOIOCTLCMD; 3001 2990 } 3002 2991 } 3003 2992 3004 - static int siocdevprivate_ioctl(struct net *net, unsigned int cmd, 2993 + /* Handle ioctls that use ifreq::ifr_data and just need struct ifreq converted */ 2994 + static int compat_ifr_data_ioctl(struct net *net, unsigned int cmd, 3005 2995 struct compat_ifreq __user *u_ifreq32) 3006 2996 { 3007 2997 struct ifreq __user *u_ifreq64; ··· 3086 3102 err = -EFAULT; 3087 3103 } 3088 3104 return err; 3089 - } 3090 - 3091 - static int compat_siocshwtstamp(struct net *net, struct compat_ifreq __user *uifr32) 3092 - { 3093 - void __user *uptr; 3094 - compat_uptr_t uptr32; 3095 - struct ifreq __user *uifr; 3096 - 3097 - uifr = compat_alloc_user_space(sizeof(*uifr)); 3098 - if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq))) 3099 - return -EFAULT; 3100 - 3101 - if (get_user(uptr32, &uifr32->ifr_data)) 3102 - return -EFAULT; 3103 - 3104 - uptr = compat_ptr(uptr32); 3105 - 3106 - if (put_user(uptr, &uifr->ifr_data)) 3107 - return -EFAULT; 3108 - 3109 - return dev_ioctl(net, SIOCSHWTSTAMP, uifr); 3110 3105 } 3111 3106 3112 3107 struct rtentry32 { ··· 3199 3236 struct net *net = sock_net(sk); 3200 3237 3201 3238 if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) 3202 - return siocdevprivate_ioctl(net, cmd, argp); 3239 + return compat_ifr_data_ioctl(net, cmd, argp); 3203 3240 3204 3241 switch (cmd) { 3205 3242 case SIOCSIFBR: ··· 3219 3256 case SIOCBONDENSLAVE: 3220 3257 case SIOCBONDRELEASE: 3221 3258 case SIOCBONDSETHWADDR: 3222 - case SIOCBONDSLAVEINFOQUERY: 3223 - case SIOCBONDINFOQUERY: 3224 3259 case SIOCBONDCHANGEACTIVE: 3225 3260 return bond_ioctl(net, cmd, argp); 3226 3261 case SIOCADDRT: ··· 3228 3267 return do_siocgstamp(net, sock, cmd, argp); 3229 3268 case SIOCGSTAMPNS: 3230 3269 return do_siocgstampns(net, sock, cmd, argp); 3270 + case SIOCBONDSLAVEINFOQUERY: 3271 + case SIOCBONDINFOQUERY: 3231 3272 case SIOCSHWTSTAMP: 3232 - return compat_siocshwtstamp(net, argp); 3273 + return compat_ifr_data_ioctl(net, cmd, argp); 3233 3274 3234 3275 case FIOSETOWN: 3235 3276 case SIOCSPGRP: