Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ksmbd: scope conn->binding slowpath to bound sessions only

When the binding SESSION_SETUP sets conn->binding = true, the flag stays
set after the call so that the global session lookup in
ksmbd_session_lookup_all() can find the session, which was not added to
conn->sessions. Because the flag is connection-wide, the global lookup
path will also resolve any other session by id if asked.

Tighten the global lookup so that the returned session must have this
connection registered in its channel xarray (sess->ksmbd_chann_list).
The channel entry is installed by the existing binding_session path in
ntlm_authenticate()/krb5_authenticate() when a SESSION_SETUP completes
successfully, so this condition is a strict equivalent of "this
connection has been accepted as a channel of this session". Connections
that have not bound to a given session cannot reach it via the global
table.

The existing conn->binding gate for entering the slowpath is preserved
so that non-binding connections keep the fast-path-only behavior, and
the session->state check is unchanged.

Fixes: f5a544e3bab7 ("ksmbd: add support for SMB3 multichannel")
Signed-off-by: Hyunwoo Kim <imv4bel@gmail.com>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>

authored by

Hyunwoo Kim and committed by
Steve French
b0da97c0 5d115fa8

+6 -1
+6 -1
fs/smb/server/mgmt/user_session.c
··· 548 548 struct ksmbd_session *sess; 549 549 550 550 sess = ksmbd_session_lookup(conn, id); 551 - if (!sess && conn->binding) 551 + if (!sess && conn->binding) { 552 552 sess = ksmbd_session_lookup_slowpath(id); 553 + if (sess && !xa_load(&sess->ksmbd_chann_list, (long)conn)) { 554 + ksmbd_user_session_put(sess); 555 + sess = NULL; 556 + } 557 + } 553 558 if (sess && sess->state != SMB2_SESSION_VALID) { 554 559 ksmbd_user_session_put(sess); 555 560 sess = NULL;