]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ksmbd: mark rejected cross-dialect bindings as signed
authorNamjae Jeon <linkinjeon@kernel.org>
Thu, 2 Jul 2026 11:40:41 +0000 (20:40 +0900)
committerSteve French <stfrench@microsoft.com>
Mon, 6 Jul 2026 12:55:41 +0000 (07:55 -0500)
Binding an SMB 2.1 session to an SMB 3.x connection is invalid because the
dialects do not match. ksmbd returns STATUS_INVALID_PARAMETER. The check
fails before attaching the referenced session to the request, so the error
response lacks SMB2_FLAGS_SIGNED.

A client requiring signing checks this flag before handling the status and
reports STATUS_ACCESS_DENIED instead of STATUS_INVALID_PARAMETER. Preserve
the signed flag for a signed binding request rejected with
STATUS_INVALID_PARAMETER. The client can then apply the special error path
without attempting to validate a response using incompatible signing
algorithms.

This fixes smb2.session.bind_negative_smb2to3s.

Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/server/smb2pdu.c

index cd2dab1907cf486f53072996d1d34cb1b1a5ae0e..123ba63b24101f260a1d5a71836e53fc932a5822 100644 (file)
@@ -2154,7 +2154,9 @@ out_err:
                rsp->hdr.Status = STATUS_ACCESS_DENIED;
        else if (rc)
                rsp->hdr.Status = STATUS_LOGON_FAILURE;
-       if (rsp->hdr.Status == STATUS_USER_SESSION_DELETED &&
+       if ((rsp->hdr.Status == STATUS_USER_SESSION_DELETED ||
+            (rsp->hdr.Status == STATUS_INVALID_PARAMETER &&
+             (req->Flags & SMB2_SESSION_REQ_FLAG_BINDING))) &&
            (req->hdr.Flags & SMB2_FLAGS_SIGNED))
                rsp->hdr.Flags |= SMB2_FLAGS_SIGNED;