net: fix compat_sys_recvmmsg parameter type
[safe/jmp/linux-2.6] / net / compat.c
index e13f525..c4d9131 100644 (file)
@@ -390,9 +390,6 @@ asmlinkage long compat_sys_setsockopt(int fd, int level, int optname,
        int err;
        struct socket *sock;
 
-       if (optlen < 0)
-               return -EINVAL;
-
        if ((sock = sockfd_lookup(fd, &err))!=NULL)
        {
                err = security_socket_setsockopt(sock,level,optname);
@@ -757,22 +754,24 @@ asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, size_t len,
 
 asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
                                    unsigned vlen, unsigned int flags,
-                                   struct timespec __user *timeout)
+                                   struct compat_timespec __user *timeout)
 {
        int datagrams;
        struct timespec ktspec;
-       struct compat_timespec __user *utspec =
-                       (struct compat_timespec __user *)timeout;
 
-       if (get_user(ktspec.tv_sec, &utspec->tv_sec) ||
-           get_user(ktspec.tv_nsec, &utspec->tv_nsec))
+       if (timeout == NULL)
+               return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
+                                     flags | MSG_CMSG_COMPAT, NULL);
+
+       if (get_user(ktspec.tv_sec, &timeout->tv_sec) ||
+           get_user(ktspec.tv_nsec, &timeout->tv_nsec))
                return -EFAULT;
 
        datagrams = __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
                                   flags | MSG_CMSG_COMPAT, &ktspec);
        if (datagrams > 0 &&
-           (put_user(ktspec.tv_sec, &utspec->tv_sec) ||
-            put_user(ktspec.tv_nsec, &utspec->tv_nsec)))
+           (put_user(ktspec.tv_sec, &timeout->tv_sec) ||
+            put_user(ktspec.tv_nsec, &timeout->tv_nsec)))
                datagrams = -EFAULT;
 
        return datagrams;