Skip to content

Commit 547ce4c

Browse files
Al Virodavem330
authored andcommitted
switch cmsghdr_from_user_compat_to_kern() to copy_from_user()
no point getting compat_cmsghdr field-by-field Signed-off-by: Al Viro <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a477605 commit 547ce4c

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

net/compat.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,20 +183,21 @@ int cmsghdr_from_user_compat_to_kern(struct msghdr *kmsg, struct sock *sk,
183183
memset(kcmsg, 0, kcmlen);
184184
ucmsg = CMSG_COMPAT_FIRSTHDR(kmsg);
185185
while (ucmsg != NULL) {
186-
if (__get_user(ucmlen, &ucmsg->cmsg_len))
186+
struct compat_cmsghdr cmsg;
187+
if (copy_from_user(&cmsg, ucmsg, sizeof(cmsg)))
187188
goto Efault;
188-
if (!CMSG_COMPAT_OK(ucmlen, ucmsg, kmsg))
189+
if (!CMSG_COMPAT_OK(cmsg.cmsg_len, ucmsg, kmsg))
189190
goto Einval;
190-
tmp = ((ucmlen - sizeof(*ucmsg)) + sizeof(struct cmsghdr));
191+
tmp = ((cmsg.cmsg_len - sizeof(*ucmsg)) + sizeof(struct cmsghdr));
191192
if ((char *)kcmsg_base + kcmlen - (char *)kcmsg < CMSG_ALIGN(tmp))
192193
goto Einval;
193194
kcmsg->cmsg_len = tmp;
195+
kcmsg->cmsg_level = cmsg.cmsg_level;
196+
kcmsg->cmsg_type = cmsg.cmsg_type;
194197
tmp = CMSG_ALIGN(tmp);
195-
if (__get_user(kcmsg->cmsg_level, &ucmsg->cmsg_level) ||
196-
__get_user(kcmsg->cmsg_type, &ucmsg->cmsg_type) ||
197-
copy_from_user(CMSG_DATA(kcmsg),
198+
if (copy_from_user(CMSG_DATA(kcmsg),
198199
CMSG_COMPAT_DATA(ucmsg),
199-
(ucmlen - sizeof(*ucmsg))))
200+
(cmsg.cmsg_len - sizeof(*ucmsg))))
200201
goto Efault;
201202

202203
/* Advance. */

0 commit comments

Comments
 (0)