Merge bk://kernel.bkbits.net/davem/sparc-2.4
Linux Kernel Mailing List <[email protected]> Fri, 25 Feb 2005 20:19:51 +0000
| Newsgroups | gmane.linux.kernel.commits.2-4 |
|---|---|
| Message-ID | <[email protected]> |
ChangeSet 1.1551, 2005/02/25 17:19:51-03:00, [email protected] Merge bk://kernel.bkbits.net/davem/sparc-2.4 into logos.cnet:/home/marcelo/bk/linux-2.4 sys_sparc32.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) diff -Nru a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c --- a/arch/sparc64/kernel/sys_sparc32.c 2005-02-25 17:03:57 -08:00 +++ b/arch/sparc64/kernel/sys_sparc32.c 2005-02-25 17:03:57 -08:00 @@ -2668,7 +2668,8 @@ * IPV6_RTHDR ipv6 routing exthdr 32-bit clean * IPV6_AUTHHDR ipv6 auth exthdr 32-bit clean */ -static void cmsg32_recvmsg_fixup(struct msghdr *kmsg, unsigned long orig_cmsg_uptr) +static void cmsg32_recvmsg_fixup(struct msghdr *kmsg, + unsigned long orig_cmsg_uptr, __kernel_size_t orig_cmsg_len) { unsigned char *workbuf, *wp; unsigned long bufsz, space_avail; @@ -2699,6 +2700,9 @@ __get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type); clen64 = kcmsg32->cmsg_len; + if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) || + (clen64 > (orig_cmsg_len + wp - workbuf))) + break; if (kcmsg32->cmsg_level == SOL_SOCKET && kcmsg32->cmsg_type == SO_TIMESTAMP) { struct timeval tv; @@ -2802,6 +2806,7 @@ struct sockaddr *uaddr; int *uaddr_len; unsigned long cmsg_ptr; + __kernel_size_t cmsg_len; int err, total_len, len = 0; if(msghdr_from_user32_to_kern(&kern_msg, user_msg)) @@ -2817,6 +2822,7 @@ total_len = err; cmsg_ptr = (unsigned long) kern_msg.msg_control; + cmsg_len = kern_msg.msg_controllen; kern_msg.msg_flags = 0; sock = sockfd_lookup(fd, &err); @@ -2842,7 +2848,8 @@ * to fix it up before we tack on more stuff. */ if((unsigned long) kern_msg.msg_control != cmsg_ptr) - cmsg32_recvmsg_fixup(&kern_msg, cmsg_ptr); + cmsg32_recvmsg_fixup(&kern_msg, + cmsg_ptr, cmsg_len); /* Wheee... */ if(sock->passcred)