get_compat_msghdr(): get rid of field-by-field copyin

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 5da028a8 ffb07550

+14 -17
+14 -17
net/compat.c
··· 37 37 struct sockaddr __user **save_addr, 38 38 struct iovec **iov) 39 39 { 40 - compat_uptr_t uaddr, uiov, tmp3; 41 - compat_size_t nr_segs; 40 + struct compat_msghdr msg; 42 41 ssize_t err; 43 42 44 - if (!access_ok(VERIFY_READ, umsg, sizeof(*umsg)) || 45 - __get_user(uaddr, &umsg->msg_name) || 46 - __get_user(kmsg->msg_namelen, &umsg->msg_namelen) || 47 - __get_user(uiov, &umsg->msg_iov) || 48 - __get_user(nr_segs, &umsg->msg_iovlen) || 49 - __get_user(tmp3, &umsg->msg_control) || 50 - __get_user(kmsg->msg_controllen, &umsg->msg_controllen) || 51 - __get_user(kmsg->msg_flags, &umsg->msg_flags)) 43 + if (copy_from_user(&msg, umsg, sizeof(*umsg))) 52 44 return -EFAULT; 53 45 54 - if (!uaddr) 46 + kmsg->msg_flags = msg.msg_flags; 47 + kmsg->msg_namelen = msg.msg_namelen; 48 + 49 + if (!msg.msg_name) 55 50 kmsg->msg_namelen = 0; 56 51 57 52 if (kmsg->msg_namelen < 0) ··· 54 59 55 60 if (kmsg->msg_namelen > sizeof(struct sockaddr_storage)) 56 61 kmsg->msg_namelen = sizeof(struct sockaddr_storage); 57 - kmsg->msg_control = compat_ptr(tmp3); 62 + 63 + kmsg->msg_control = compat_ptr(msg.msg_control); 64 + kmsg->msg_controllen = msg.msg_controllen; 58 65 59 66 if (save_addr) 60 - *save_addr = compat_ptr(uaddr); 67 + *save_addr = compat_ptr(msg.msg_name); 61 68 62 - if (uaddr && kmsg->msg_namelen) { 69 + if (msg.msg_name && kmsg->msg_namelen) { 63 70 if (!save_addr) { 64 - err = move_addr_to_kernel(compat_ptr(uaddr), 71 + err = move_addr_to_kernel(compat_ptr(msg.msg_name), 65 72 kmsg->msg_namelen, 66 73 kmsg->msg_name); 67 74 if (err < 0) ··· 74 77 kmsg->msg_namelen = 0; 75 78 } 76 79 77 - if (nr_segs > UIO_MAXIOV) 80 + if (msg.msg_iovlen > UIO_MAXIOV) 78 81 return -EMSGSIZE; 79 82 80 83 kmsg->msg_iocb = NULL; 81 84 82 85 return compat_import_iovec(save_addr ? READ : WRITE, 83 - compat_ptr(uiov), nr_segs, 86 + compat_ptr(msg.msg_iov), msg.msg_iovlen, 84 87 UIO_FASTIOV, iov, &kmsg->msg_iter); 85 88 } 86 89