summaryrefslogtreecommitdiff
path: root/fs/smb/server/oplock.c
diff options
context:
space:
mode:
authorNamjae Jeon <linkinjeon@kernel.org>2023-08-19 20:26:17 +0900
committerSteve French <stfrench@microsoft.com>2023-08-29 12:30:19 -0500
commit041bba4414cda37d00063952c9bff9c3d5812a19 (patch)
treebe4ef69bdd54c6e0b94acc877e5873f93f8c65a7 /fs/smb/server/oplock.c
parente2b76ab8b5c9327ab2dae6da05d0752eb2f4771d (diff)
downloadlinux-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.c14
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);