Merge branches 'acpi-cppc', 'acpi-video' and 'acpi-drivers'
[linux-2.6-microblaze.git] / net / socket.c
index b79a05d..2dd739f 100644 (file)
@@ -1707,7 +1707,8 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog)
 
 int __sys_accept4_file(struct file *file, unsigned file_flags,
                       struct sockaddr __user *upeer_sockaddr,
-                      int __user *upeer_addrlen, int flags)
+                      int __user *upeer_addrlen, int flags,
+                      unsigned long nofile)
 {
        struct socket *sock, *newsock;
        struct file *newfile;
@@ -1738,7 +1739,7 @@ int __sys_accept4_file(struct file *file, unsigned file_flags,
         */
        __module_get(newsock->ops->owner);
 
-       newfd = get_unused_fd_flags(flags);
+       newfd = __get_unused_fd_flags(flags, nofile);
        if (unlikely(newfd < 0)) {
                err = newfd;
                sock_release(newsock);
@@ -1807,7 +1808,8 @@ int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
        f = fdget(fd);
        if (f.file) {
                ret = __sys_accept4_file(f.file, 0, upeer_sockaddr,
-                                               upeer_addrlen, flags);
+                                               upeer_addrlen, flags,
+                                               rlimit(RLIMIT_NOFILE));
                if (f.flags)
                        fput(f.file);
        }
@@ -2226,10 +2228,10 @@ struct used_address {
        unsigned int name_len;
 };
 
-static int copy_msghdr_from_user(struct msghdr *kmsg,
-                                struct user_msghdr __user *umsg,
-                                struct sockaddr __user **save_addr,
-                                struct iovec **iov)
+int __copy_msghdr_from_user(struct msghdr *kmsg,
+                           struct user_msghdr __user *umsg,
+                           struct sockaddr __user **save_addr,
+                           struct iovec __user **uiov, size_t *nsegs)
 {
        struct user_msghdr msg;
        ssize_t err;
@@ -2271,6 +2273,23 @@ static int copy_msghdr_from_user(struct msghdr *kmsg,
                return -EMSGSIZE;
 
        kmsg->msg_iocb = NULL;
+       *uiov = msg.msg_iov;
+       *nsegs = msg.msg_iovlen;
+       return 0;
+}
+
+static int copy_msghdr_from_user(struct msghdr *kmsg,
+                                struct user_msghdr __user *umsg,
+                                struct sockaddr __user **save_addr,
+                                struct iovec **iov)
+{
+       struct user_msghdr msg;
+       ssize_t err;
+
+       err = __copy_msghdr_from_user(kmsg, umsg, save_addr, &msg.msg_iov,
+                                       &msg.msg_iovlen);
+       if (err)
+               return err;
 
        err = import_iovec(save_addr ? READ : WRITE,
                            msg.msg_iov, msg.msg_iovlen,