Linux CIFS filesystem development
 help / color / mirror / Atom feed
From: Stefan Metzmacher <metze@samba.org>
To: linux-cifs@vger.kernel.org, samba-technical@lists.samba.org
Cc: Tom Talpey <tom@talpey.com>, Paulo Alcantara <pc@manguebit.org>,
	Namjae Jeon <linkinjeon@kernel.org>
Subject: Re: [PATCH 0/5] smb: client: don't use server->smbd_conn without a reference or lock
Date: Mon, 5 Oct 2026 21:42:54 +0200	[thread overview]
Message-ID: <1111a3da-3eb7-44e0-8c68-4a09bb4615a1@samba.org> (raw)
In-Reply-To: <cover.1791225453.git.metze@samba.org>

Hi Paulo/Namjae,

I'll address these https://sashiko.dev/#/patchset/cover.1791225453.git.metze%40samba.org
and resubmit v2 later...

metze

> The SMB Direct client keeps the transport in server->smbd_conn and
> accesses it from several places without any locking:
> 
>    - smbd_get_parameters()
>    - smbd_register_mr()
>    - smbd_debug_proc_show()
> 
> At the same time cifs_abort_connection() (and the reconnect path) can
> call smbd_destroy() at any time, which frees the smbd_connection and
> releases the underlying smbdirect socket. So the readers above can race
> with the teardown and end up using a freed connection/socket, a
> use-after-free.
> 
> While looking at this, smbd_get_parameters() also turned out to
> dereference server->smbd_conn without checking it, which is a NULL
> pointer dereference in smb2_negotiate_wsize()/smb2_negotiate_rsize()
> when it is called during a reconnect window.
> 
> This series closes the races:
> 
>    - server->smbd_conn is only ever changed under server->srv_lock, so
>      readers can safely look at it while holding that lock.
> 
>    - smbdirect gets smbdirect_socket_get()/smbdirect_socket_put(), which
>      take and drop a reference that keeps the socket memory alive (but
>      does not keep it connected). smbd_register_mr() uses them to hold
>      the socket across smbdirect_connection_register_mr_io(); once the
>      connection is gone the socket is no longer connected and the call
>      fails gracefully. A registered MR has its own reference counting.
> 
>    - smbd_get_parameters() no longer returns a pointer into the socket
>      (which cannot be kept valid for the callers). It copies the current
>      parameters into the new server->smbd_params under server->srv_lock
>      and returns a pointer to that; with no connection it returns zeros.
> 
>    - smbd_debug_proc_show() runs with cifs_tcp_ses_lock held, so it takes
>      server->srv_lock instead of a socket reference.
> 
> The two "pass server to ..." patches are mechanical prototype changes
> with no behaviour change, split out so the final fix stays small and
> each step builds on its own.
> 
> All of this is a use-after-free that goes back to the switch to the
> smbdirect socket API, so the whole series is tagged for stable via
> 
>    Fixes: b8aef8c8808c ("smb: client: make use of smbdirect_socket_create_kern()/smbdirect_socket_release()")
> 
> which is in mainline since v7.1-rc1.
> 
> I run various xfstests with this.
> 
> I'm unsure if this should go via cifs-next or ksmbd-for-next,
> for consistency with the series I just send I guess both
> could go via ksmbd-for-next?
> 
> Stefan Metzmacher (5):
>    smb: client: change server->smbd_conn only under server->srv_lock
>    smb: smbdirect: add smbdirect_socket_get() and smbdirect_socket_put()
>    smb: client: pass server to smbd_get_parameters()
>    smb: client: pass server to smbd_register_mr()
>    smb: client: don't use server->smbd_conn without a reference or lock
> 
>   fs/smb/client/cifsglob.h  |  12 ++++
>   fs/smb/client/connect.c   |  12 +++-
>   fs/smb/client/file.c      |   4 +-
>   fs/smb/client/smb2ops.c   |   4 +-
>   fs/smb/client/smb2pdu.c   |   4 +-
>   fs/smb/client/smbdirect.c | 124 +++++++++++++++++++++++++++++++++-----
>   fs/smb/client/smbdirect.h |   8 ++-
>   fs/smb/smbdirect/socket.c |  27 +++++++++
>   include/linux/smbdirect.h |   3 +
>   9 files changed, 171 insertions(+), 27 deletions(-)
> 


  parent reply	other threads:[~2026-10-05 19:42 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-05 18:46 [PATCH 0/5] smb: client: don't use server->smbd_conn without a reference or lock Stefan Metzmacher
2026-10-05 18:46 ` [PATCH 1/5] smb: client: change server->smbd_conn only under server->srv_lock Stefan Metzmacher
2026-10-05 18:46 ` [PATCH 2/5] smb: smbdirect: add smbdirect_socket_get() and smbdirect_socket_put() Stefan Metzmacher
2026-10-05 18:46 ` [PATCH 3/5] smb: client: pass server to smbd_get_parameters() Stefan Metzmacher
2026-10-05 18:46 ` [PATCH 4/5] smb: client: pass server to smbd_register_mr() Stefan Metzmacher
2026-10-05 18:47 ` [PATCH 5/5] smb: client: don't use server->smbd_conn without a reference or lock Stefan Metzmacher
2026-10-05 19:42 ` Stefan Metzmacher [this message]
2026-10-06 20:13   ` [PATCH 0/5] " Paulo Alcantara

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=1111a3da-3eb7-44e0-8c68-4a09bb4615a1@samba.org \
    --to=metze@samba.org \
    --cc=linkinjeon@kernel.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=pc@manguebit.org \
    --cc=samba-technical@lists.samba.org \
    --cc=tom@talpey.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox