summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Brauner <brauner@kernel.org>2025-12-05 13:50:31 +0100
committerChristian Brauner <brauner@kernel.org>2025-12-05 13:57:39 +0100
commitafb9917d9b374ecb77d478c2a052e20875c6e232 (patch)
treeb1dd91b178a65f3a76affb49ec1d5780d180e583
parentb6cb3ccef6e1e275f238d7ecc5986fd6b993e870 (diff)
Revert "net/socket: convert sock_map_fd() to FD_ADD()"
This reverts commit 245f0d1c622b0183ce4f44b3e39aeacf78fae594. When allocating a file sock_alloc_file() consumes the socket reference unconditionally which isn't correctly handled in the conversion. This can be fixed by massaging this appropriately but this is best left for next cycle. Reported-by: Xin Long <lucien.xin@gmail.com> Link: https://lore.kernel.org/CADvbK_ewub4ZZK-tZg8GBQbDFHWhd9a48C+AFXZ93pMsssCrUg@mail.gmail.com Signed-off-by: Christian Brauner <brauner@kernel.org>
-rw-r--r--net/socket.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/net/socket.c b/net/socket.c
index e1bf93508f05..acd8fa6ffa66 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -503,12 +503,21 @@ EXPORT_SYMBOL(sock_alloc_file);
static int sock_map_fd(struct socket *sock, int flags)
{
- int fd;
-
- fd = FD_ADD(flags, sock_alloc_file(sock, flags, NULL));
- if (fd < 0)
+ struct file *newfile;
+ int fd = get_unused_fd_flags(flags);
+ if (unlikely(fd < 0)) {
sock_release(sock);
- return fd;
+ return fd;
+ }
+
+ newfile = sock_alloc_file(sock, flags, NULL);
+ if (!IS_ERR(newfile)) {
+ fd_install(fd, newfile);
+ return fd;
+ }
+
+ put_unused_fd(fd);
+ return PTR_ERR(newfile);
}
/**