ksmbd: use the session dialect for rejected binding signatures
Changes
2 files changed · +21 −5
| File | Status | Add | Del | Content |
|---|---|---|---|---|
| fs/smb/server/server.c | modified | +8 | −2 | View file |
| fs/smb/server/smb2pdu.c | modified | +13 | −3 | View file |
fs/smb/server/server.c
View filediff --git a/fs/smb/server/server.c b/fs/smb/server/server.c
index bc861ca..f5baba9 100644
--- a/fs/smb/server/server.c
+++ b/fs/smb/server/server.c
@@ -243,8 +243,14 @@ static void __handle_ksmbd_work(struct ksmbd_work *work,
if (work->sess &&
(work->sess->sign || smb3_11_final_sess_setup_resp(work) ||
- conn->ops->is_sign_req(work, command)))
- conn->ops->set_sign_rsp(work);
+ conn->ops->is_sign_req(work, command))) {
+ if (command == SMB2_SESSION_SETUP_HE &&
+ work->sess->dialect >= SMB30_PROT_ID &&
+ conn->dialect < SMB30_PROT_ID)
+ smb3_set_sign_rsp(work);
+ else
+ conn->ops->set_sign_rsp(work);
+ }
} while (is_chained == true);
send:
fs/smb/server/smb2pdu.c
View filediff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
index 123ba63..b731677 100644
--- a/fs/smb/server/smb2pdu.c
+++ b/fs/smb/server/smb2pdu.c
@@ -2015,10 +2015,16 @@ int smb2_sess_setup(struct ksmbd_work *work)
(req->Flags & SMB2_SESSION_REQ_FLAG_BINDING)) {
sess = ksmbd_session_lookup_slowpath(le64_to_cpu(req->hdr.SessionId));
if (sess) {
+ int sign_ret;
+
work->sess = sess;
+ if (sess->dialect >= SMB30_PROT_ID)
+ sign_ret = smb3_check_sign_req(work);
+ else
+ sign_ret = smb2_check_sign_req(work);
if (sess->state != SMB2_SESSION_VALID ||
!(req->hdr.Flags & SMB2_FLAGS_SIGNED) ||
- !conn->ops->check_sign_req(work)) {
+ !sign_ret) {
ksmbd_user_session_put(sess);
work->sess = NULL;
sess = NULL;
@@ -9681,9 +9687,13 @@ int smb3_check_sign_req(struct ksmbd_work *work)
} else {
chann = lookup_chann_list(work->sess, conn);
if (!chann) {
- return 0;
+ if (le16_to_cpu(hdr->Command) != SMB2_SESSION_SETUP_HE ||
+ !(hdr->Flags & SMB2_FLAGS_SIGNED))
+ return 0;
+ signing_key = work->sess->smb3signingkey;
+ } else {
+ signing_key = chann->smb3signingkey;
}
- signing_key = chann->smb3signingkey;
}
if (!signing_key) {