diff options
author | Namjae Jeon <linkinjeon@kernel.org> | 2023-08-19 20:26:17 +0900 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2023-08-29 12:30:19 -0500 |
commit | 041bba4414cda37d00063952c9bff9c3d5812a19 (patch) | |
tree | be4ef69bdd54c6e0b94acc877e5873f93f8c65a7 /fs/smb/server/oplock.c | |
parent | e2b76ab8b5c9327ab2dae6da05d0752eb2f4771d (diff) | |
download | linux-041bba4414cda37d00063952c9bff9c3d5812a19.tar.gz linux-041bba4414cda37d00063952c9bff9c3d5812a19.tar.bz2 linux-041bba4414cda37d00063952c9bff9c3d5812a19.zip |
ksmbd: fix wrong interim response on compound
If smb2_lock or smb2_open request is compound, ksmbd could send wrong
interim response to client. ksmbd allocate new interim buffer instead of
using resonse buffer to support compound request.
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs/smb/server/oplock.c')
-rw-r--r-- | fs/smb/server/oplock.c | 14 |
1 files changed, 2 insertions, 12 deletions
diff --git a/fs/smb/server/oplock.c b/fs/smb/server/oplock.c index c42b2cff6146..6bc8a1e48171 100644 --- a/fs/smb/server/oplock.c +++ b/fs/smb/server/oplock.c @@ -616,15 +616,6 @@ static int oplock_break_pending(struct oplock_info *opinfo, int req_op_level) return 0; } -static inline int allocate_oplock_break_buf(struct ksmbd_work *work) -{ - work->response_buf = kzalloc(MAX_CIFS_SMALL_BUFFER_SIZE, GFP_KERNEL); - if (!work->response_buf) - return -ENOMEM; - work->response_sz = MAX_CIFS_SMALL_BUFFER_SIZE; - return 0; -} - /** * __smb2_oplock_break_noti() - send smb2 oplock break cmd from conn * to client @@ -647,7 +638,7 @@ static void __smb2_oplock_break_noti(struct work_struct *wk) if (!fp) goto out; - if (allocate_oplock_break_buf(work)) { + if (allocate_interim_rsp_buf(work)) { pr_err("smb2_allocate_rsp_buf failed! "); ksmbd_fd_put(work, fp); goto out; @@ -752,7 +743,7 @@ static void __smb2_lease_break_noti(struct work_struct *wk) struct lease_break_info *br_info = work->request_buf; struct smb2_hdr *rsp_hdr; - if (allocate_oplock_break_buf(work)) { + if (allocate_interim_rsp_buf(work)) { ksmbd_debug(OPLOCK, "smb2_allocate_rsp_buf failed! "); goto out; } @@ -843,7 +834,6 @@ static int smb2_lease_break_noti(struct oplock_info *opinfo) setup_async_work(in_work, NULL, NULL); smb2_send_interim_resp(in_work, STATUS_PENDING); list_del(&in_work->interim_entry); - ksmbd_iov_reset(in_work); } INIT_WORK(&work->work, __smb2_lease_break_noti); ksmbd_queue_work(work); |