From: Steve Grubb <sgrubb@redhat.com>
To: netdev@vger.kernel.org
Cc: edumazet@google.com, kuniyu@google.com, pabeni@redhat.com,
willemb@google.com, davem@davemloft.net, kuba@kernel.org,
horms@kernel.org, shuah@kernel.org
Subject: [PATCH net 1/1] net: preserve socketpair output on setup failure
Date: Thu, 10 Sep 2026 13:53:15 -0400 [thread overview]
Message-ID: <JyK226D0S5CWGUpAC4MO4A@redhat.com> (raw)
socketpair() writes the reserved descriptor numbers to userspace before
creating the sockets and their file objects. A later failure therefore
leaves a modified caller's array despite returning an error, contrary to
POSIX. For example, socketpair(AF_UNIX, SOCK_STREAM, -1, fd) returns
EPROTONOSUPPORT but replaces the array's sentinel values with unused fd
numbers.
Defer the output stores until both file objects have been created, before
installing either descriptor. If a store faults, drop both file references
before releasing the reserved descriptor slots. Keep the early descriptor
reservation and the existing setup-failure cleanup paths.
In practice, I doubt anyone notices. But this aligns with the expected
behavior
Signed-off-by: Steve Grubb <sgrubb@redhat.com>
---
net/socket.c | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/net/socket.c b/net/socket.c
index c05d86e63abf..4cb8662869f0 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1851,10 +1851,7 @@ int __sys_socketpair(int family, int type, int protocol, int __user *usockvec)
if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
- /*
- * reserve descriptors and make sure we won't fail
- * to return them to userland.
- */
+ /* Reserve both descriptors before creating the sockets. */
fd1 = get_unused_fd_flags(flags);
if (unlikely(fd1 < 0))
return fd1;
@@ -1865,14 +1862,6 @@ int __sys_socketpair(int family, int type, int protocol, int __user *usockvec)
return fd2;
}
- err = put_user(fd1, &usockvec[0]);
- if (err)
- goto out;
-
- err = put_user(fd2, &usockvec[1]);
- if (err)
- goto out;
-
/*
* Obtain the first socket and check if the underlying protocol
* supports the socketpair call.
@@ -1916,6 +1905,16 @@ int __sys_socketpair(int family, int type, int protocol, int __user *usockvec)
goto out;
}
+ /* Publish the descriptors now that it shouldn't fail. */
+ err = put_user(fd1, &usockvec[0]);
+ if (!err)
+ err = put_user(fd2, &usockvec[1]);
+ if (err) {
+ fput(newfile2);
+ fput(newfile1);
+ goto out;
+ }
+
audit_fd_pair(fd1, fd2);
fd_install(fd1, newfile1);
--
2.55.0
next reply other threads:[~2026-09-10 17:53 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-10 17:53 Steve Grubb [this message]
2026-09-11 17:54 ` [PATCH net 1/1] net: preserve socketpair output on setup failure netdev-bot+sashiko
2026-09-17 2:10 ` patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=JyK226D0S5CWGUpAC4MO4A@redhat.com \
--to=sgrubb@redhat.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=kuniyu@google.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=shuah@kernel.org \
--cc=willemb@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.