smb: use kernel_connect() and kernel_bind()
authorJordan Rife <jrife@google.com>
Wed, 4 Oct 2023 01:13:03 +0000 (20:13 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Oct 2023 20:00:44 +0000 (22:00 +0200)
commit cedc019b9f260facfadd20c6c490e403abf292e3 upstream.

Recent changes to kernel_connect() and kernel_bind() ensure that
callers are insulated from changes to the address parameter made by BPF
SOCK_ADDR hooks. This patch wraps direct calls to ops->connect() and
ops->bind() with kernel_connect() and kernel_bind() to ensure that SMB
mounts do not see their mount address overwritten in such cases.

Link: https://lore.kernel.org/netdev/9944248dba1bce861375fcce9de663934d933ba9.camel@redhat.com/
Cc: <stable@vger.kernel.org> # 6.0+
Signed-off-by: Jordan Rife <jrife@google.com>
Acked-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/smb/client/connect.c

index 57da4f2..acb8951 100644 (file)
@@ -2901,9 +2901,9 @@ bind_socket(struct TCP_Server_Info *server)
        if (server->srcaddr.ss_family != AF_UNSPEC) {
                /* Bind to the specified local IP address */
                struct socket *socket = server->ssocket;
-               rc = socket->ops->bind(socket,
-                                      (struct sockaddr *) &server->srcaddr,
-                                      sizeof(server->srcaddr));
+               rc = kernel_bind(socket,
+                                (struct sockaddr *) &server->srcaddr,
+                                sizeof(server->srcaddr));
                if (rc < 0) {
                        struct sockaddr_in *saddr4;
                        struct sockaddr_in6 *saddr6;
@@ -3050,8 +3050,8 @@ generic_ip_connect(struct TCP_Server_Info *server)
                 socket->sk->sk_sndbuf,
                 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
 
-       rc = socket->ops->connect(socket, saddr, slen,
-                                 server->noblockcnt ? O_NONBLOCK : 0);
+       rc = kernel_connect(socket, saddr, slen,
+                           server->noblockcnt ? O_NONBLOCK : 0);
        /*
         * When mounting SMB root file systems, we do not want to block in
         * connect. Otherwise bail out and then let cifs_reconnect() perform