reorder alloc_fd/attach_fd in socketpair()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 5 Aug 2009 15:29:23 +0000 (19:29 +0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 16 Dec 2009 17:16:41 +0000 (12:16 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
net/socket.c

index b94c3dd..bf538be 100644 (file)
@@ -1396,23 +1396,30 @@ SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
                goto out_release_both;
        }
 
-       fd2 = sock_alloc_fd(&newfile2, flags & O_CLOEXEC);
-       if (unlikely(fd2 < 0)) {
-               err = fd2;
+       err = sock_attach_fd(sock1, newfile1, flags & O_NONBLOCK);
+       if (unlikely(err < 0)) {
                put_filp(newfile1);
                put_unused_fd(fd1);
                goto out_release_both;
        }
 
-       err = sock_attach_fd(sock1, newfile1, flags & O_NONBLOCK);
-       if (unlikely(err < 0)) {
-               goto out_fd2;
+       fd2 = sock_alloc_fd(&newfile2, flags & O_CLOEXEC);
+       if (unlikely(fd2 < 0)) {
+               err = fd2;
+               fput(newfile1);
+               put_unused_fd(fd1);
+               sock_release(sock2);
+               goto out;
        }
 
        err = sock_attach_fd(sock2, newfile2, flags & O_NONBLOCK);
        if (unlikely(err < 0)) {
+               put_filp(newfile2);
+               put_unused_fd(fd2);
                fput(newfile1);
-               goto out_fd1;
+               put_unused_fd(fd1);
+               sock_release(sock2);
+               goto out;
        }
 
        audit_fd_pair(fd1, fd2);
@@ -1438,16 +1445,6 @@ out_release_1:
        sock_release(sock1);
 out:
        return err;
-
-out_fd2:
-       put_filp(newfile1);
-       sock_release(sock1);
-out_fd1:
-       put_filp(newfile2);
-       sock_release(sock2);
-       put_unused_fd(fd1);
-       put_unused_fd(fd2);
-       goto out;
 }
 
 /*