[PATCH v7 8/9] ksmbd: make smb2_check_user_session() callable for compound PDUs

Ralph Boehme
2021-10-05T05:04:15Z

Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: Tom Talpey <tom@talpey.com>
Cc: Ronnie Sahlberg <ronniesahlberg@gmail.com>
Cc: Steve French <smfrench@gmail.com>
Cc: Hyunchul Lee <hyc.lee@gmail.com>
Signed-off-by: Ralph Boehme <slow@samba.org>
---
fs/ksmbd/smb2pdu.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c
index 1755a524beb3..c137c1a94b99 100644
--- a/fs/ksmbd/smb2pdu.c
+++ b/fs/ksmbd/smb2pdu.c
@@ -416,7 +416,6 @@ static void init_chained_smb2_rsp(struct ksmbd_work *work)
work->compound_pfid =
le64_to_cpu(((struct smb2_create_rsp *)rsp)->
PersistentFileId);
- work->compound_sid = le64_to_cpu(rsp->SessionId);
}

len = get_rfc1002_len(work->response_buf) - work->next_smb2_rsp_hdr_off;
@@ -596,7 +595,6 @@ int smb2_check_user_session(struct ksmbd_work *work)
unsigned int cmd = conn->ops->get_cmd_val(work);
unsigned long long sess_id;

- work->sess = NULL;
/*
* SMB2_ECHO, SMB2_NEGOTIATE, SMB2_SESSION_SETUP command do not
* require a session id, so no need to validate user session's for
@@ -609,11 +607,25 @@ int smb2_check_user_session(struct ksmbd_work *work)
if (!ksmbd_conn_good(work))
return -EINVAL;

+ if (req_hdr->Flags & SMB2_FLAGS_RELATED_OPERATIONS) {
+ if (work->sess) {
+ pr_err("Missing session\n");
+ return -EINVAL;
+ }
+ return 1;
+ }
+
+ work->sess = NULL;
+ work->compound_sid = 0;
+
sess_id = le64_to_cpu(req_hdr->SessionId);
+
/* Check for validity of user session */
work->sess = ksmbd_session_lookup_all(conn, sess_id);
- if (work->sess)
+ if (work->sess) {
+ work->compound_sid = sess_id;
return 1;
+ }
ksmbd_debug(SMB, "Invalid user session, Uid %llu\n", sess_id);
return -EINVAL;
}
--
2.31.1