@@ -37,36 +37,33 @@ int get_compat_msghdr(struct msghdr *kmsg,
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 )
58
53
return - EINVAL ;
59
54
60
55
if (kmsg -> msg_namelen > sizeof (struct sockaddr_storage ))
61
56
kmsg -> msg_namelen = sizeof (struct sockaddr_storage );
62
- kmsg -> msg_control = compat_ptr (tmp3 );
57
+
58
+ kmsg -> msg_control = compat_ptr (msg .msg_control );
59
+ kmsg -> msg_controllen = msg .msg_controllen ;
63
60
64
61
if (save_addr )
65
- * save_addr = compat_ptr (uaddr );
62
+ * save_addr = compat_ptr (msg . msg_name );
66
63
67
- if (uaddr && kmsg -> msg_namelen ) {
64
+ if (msg . msg_name && kmsg -> msg_namelen ) {
68
65
if (!save_addr ) {
69
- err = move_addr_to_kernel (compat_ptr (uaddr ),
66
+ err = move_addr_to_kernel (compat_ptr (msg . msg_name ),
70
67
kmsg -> msg_namelen ,
71
68
kmsg -> msg_name );
72
69
if (err < 0 )
@@ -77,13 +74,13 @@ int get_compat_msghdr(struct msghdr *kmsg,
77
74
kmsg -> msg_namelen = 0 ;
78
75
}
79
76
80
- if (nr_segs > UIO_MAXIOV )
77
+ if (msg . msg_iovlen > UIO_MAXIOV )
81
78
return - EMSGSIZE ;
82
79
83
80
kmsg -> msg_iocb = NULL ;
84
81
85
82
return compat_import_iovec (save_addr ? READ : WRITE ,
86
- compat_ptr (uiov ), nr_segs ,
83
+ compat_ptr (msg . msg_iov ), msg . msg_iovlen ,
87
84
UIO_FASTIOV , iov , & kmsg -> msg_iter );
88
85
}
89
86
0 commit comments