diff options
-rw-r--r-- | net/compat.c | 9 | ||||
-rw-r--r-- | net/core/iovec.c | 6 |
2 files changed, 8 insertions, 7 deletions
diff --git a/net/compat.c b/net/compat.c index 9a76eaf63184..bc8aeefddf3f 100644 --- a/net/compat.c +++ b/net/compat.c | |||
@@ -85,7 +85,7 @@ int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov, | |||
85 | { | 85 | { |
86 | int tot_len; | 86 | int tot_len; |
87 | 87 | ||
88 | if (kern_msg->msg_namelen) { | 88 | if (kern_msg->msg_name && kern_msg->msg_namelen) { |
89 | if (mode == VERIFY_READ) { | 89 | if (mode == VERIFY_READ) { |
90 | int err = move_addr_to_kernel(kern_msg->msg_name, | 90 | int err = move_addr_to_kernel(kern_msg->msg_name, |
91 | kern_msg->msg_namelen, | 91 | kern_msg->msg_namelen, |
@@ -93,10 +93,11 @@ int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov, | |||
93 | if (err < 0) | 93 | if (err < 0) |
94 | return err; | 94 | return err; |
95 | } | 95 | } |
96 | if (kern_msg->msg_name) | 96 | kern_msg->msg_name = kern_address; |
97 | kern_msg->msg_name = kern_address; | 97 | } else { |
98 | } else | ||
99 | kern_msg->msg_name = NULL; | 98 | kern_msg->msg_name = NULL; |
99 | kern_msg->msg_namelen = 0; | ||
100 | } | ||
100 | 101 | ||
101 | tot_len = iov_from_user_compat_to_kern(kern_iov, | 102 | tot_len = iov_from_user_compat_to_kern(kern_iov, |
102 | (struct compat_iovec __user *)kern_msg->msg_iov, | 103 | (struct compat_iovec __user *)kern_msg->msg_iov, |
diff --git a/net/core/iovec.c b/net/core/iovec.c index 827dd6beb49c..e1ec45ab1e63 100644 --- a/net/core/iovec.c +++ b/net/core/iovec.c | |||
@@ -39,7 +39,7 @@ int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *a | |||
39 | { | 39 | { |
40 | int size, ct, err; | 40 | int size, ct, err; |
41 | 41 | ||
42 | if (m->msg_namelen) { | 42 | if (m->msg_name && m->msg_namelen) { |
43 | if (mode == VERIFY_READ) { | 43 | if (mode == VERIFY_READ) { |
44 | void __user *namep; | 44 | void __user *namep; |
45 | namep = (void __user __force *) m->msg_name; | 45 | namep = (void __user __force *) m->msg_name; |
@@ -48,10 +48,10 @@ int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *a | |||
48 | if (err < 0) | 48 | if (err < 0) |
49 | return err; | 49 | return err; |
50 | } | 50 | } |
51 | if (m->msg_name) | 51 | m->msg_name = address; |
52 | m->msg_name = address; | ||
53 | } else { | 52 | } else { |
54 | m->msg_name = NULL; | 53 | m->msg_name = NULL; |
54 | m->msg_namelen = 0; | ||
55 | } | 55 | } |
56 | 56 | ||
57 | size = m->msg_iovlen * sizeof(struct iovec); | 57 | size = m->msg_iovlen * sizeof(struct iovec); |