]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/handshake: convert handshake_nl_accept_doit() to FD_PREPARE()
authorChristian Brauner <brauner@kernel.org>
Sun, 23 Nov 2025 16:33:45 +0000 (17:33 +0100)
committerChristian Brauner <brauner@kernel.org>
Fri, 28 Nov 2025 11:42:34 +0000 (12:42 +0100)
Link: https://patch.msgid.link/20251123-work-fd-prepare-v4-27-b6efa1706cfd@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
net/handshake/netlink.c

index 7e46d130dce2cdcdb97f57d649568fd7897e05a8..1d33a4675a4831ce6f0c840dd5f3dd08c19b98fa 100644 (file)
@@ -93,7 +93,7 @@ int handshake_nl_accept_doit(struct sk_buff *skb, struct genl_info *info)
        struct handshake_net *hn = handshake_pernet(net);
        struct handshake_req *req = NULL;
        struct socket *sock;
-       int class, fd, err;
+       int class, err;
 
        err = -EOPNOTSUPP;
        if (!hn)
@@ -106,27 +106,25 @@ int handshake_nl_accept_doit(struct sk_buff *skb, struct genl_info *info)
 
        err = -EAGAIN;
        req = handshake_req_next(hn, class);
-       if (!req)
-               goto out_status;
-
-       sock = req->hr_sk->sk_socket;
-       fd = get_unused_fd_flags(O_CLOEXEC);
-       if (fd < 0) {
-               err = fd;
-               goto out_complete;
-       }
-
-       err = req->hr_proto->hp_accept(req, info, fd);
-       if (err) {
-               put_unused_fd(fd);
-               goto out_complete;
+       if (req) {
+               sock = req->hr_sk->sk_socket;
+
+               FD_PREPARE(fdf, O_CLOEXEC, sock->file);
+               if (fdf.err) {
+                       err = fdf.err;
+                       goto out_complete;
+               }
+
+               get_file(sock->file); /* FD_PREPARE() consumes a reference. */
+               err = req->hr_proto->hp_accept(req, info, fd_prepare_fd(fdf));
+               if (err)
+                       goto out_complete; /* Automatic cleanup handles fput */
+
+               trace_handshake_cmd_accept(net, req, req->hr_sk, fd_prepare_fd(fdf));
+               fd_publish(fdf);
+               return 0;
        }
 
-       fd_install(fd, get_file(sock->file));
-
-       trace_handshake_cmd_accept(net, req, req->hr_sk, fd);
-       return 0;
-
 out_complete:
        handshake_complete(req, -EIO, NULL);
 out_status: