]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb: client: avoid double-free in smbd_free_send_io() after smbd_send_batch_flush()
authorStefan Metzmacher <metze@samba.org>
Fri, 10 Apr 2026 10:48:54 +0000 (12:48 +0200)
committerSteve French <stfrench@microsoft.com>
Sun, 12 Apr 2026 23:07:55 +0000 (18:07 -0500)
smbd_send_batch_flush() already calls smbd_free_send_io(),
so we should not call it again after smbd_post_send()
moved it to the batch list.

Reported-by: Ruikai Peng <ruikai@pwno.io>
Closes: https://lore.kernel.org/linux-cifs/CAFD3drNOSJ05y3A+jNXSDxW-2w09KHQ0DivhxQ_pcc7immVVOQ@mail.gmail.com/
Fixes: 21538121efe6 ("smb: client: make use of smbdirect_socket.send_io.bcredits")
Cc: stable@kernel.org
Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Cc: Ruikai Peng <ruikai@pwno.io>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Cc: security@kernel.org
Acked-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Tested-by: Ruikai Peng <ruikai@pwno.io>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/smbdirect.c

index c79304012b08c3e807ed71590c6339e2b22d225d..461658105013318b6018f06e93e29d749b19257e 100644 (file)
@@ -1551,17 +1551,25 @@ static int smbd_post_send_iter(struct smbdirect_socket *sc,
 
        rc = smbd_post_send(sc, batch, request);
        if (!rc) {
+               /*
+                * From here request is moved to batch
+                * and we should not free it explicitly.
+                */
+
                if (batch != &_batch)
                        return 0;
 
                rc = smbd_send_batch_flush(sc, batch, true);
                if (!rc)
                        return 0;
+
+               goto err_flush;
        }
 
 err_dma:
        smbd_free_send_io(request);
 
+err_flush:
 err_alloc:
        atomic_inc(&sc->send_io.credits.count);
        wake_up(&sc->send_io.credits.wait_queue);