diff mbox series

ksmbd: fix a missing return value check bug

Message ID 20241223153050.332-1-liangwentao@iscas.ac.cn (mailing list archive)
State New, archived
Headers show
Series ksmbd: fix a missing return value check bug | expand

Commit Message

Wentao Liang Dec. 23, 2024, 3:30 p.m. UTC
In the smb2_send_interim_resp(), if ksmbd_alloc_work_struct()
fails to allocate a node, it returns a NULL pointer to the
in_work pointer. This can lead to an illegal memory write of
in_work->response_buf when allocate_interim_rsp_buf() attempts
to perform a kzalloc() on it.

To address this issue, incorporating a check for the return
value of ksmbd_alloc_work_struct() ensures that the function
returns immediately upon allocation failure, thereby preventing
the aforementioned illegal memory access.

Fixes: 041bba4414cd ("ksmbd: fix wrong interim response on compound")
Signed-off-by: Wentao Liang <liangwentao@iscas.ac.cn>
---
 fs/smb/server/smb2pdu.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Namjae Jeon Dec. 24, 2024, 12:45 a.m. UTC | #1
On Tue, Dec 24, 2024 at 12:37 AM Wentao Liang <liangwentao@iscas.ac.cn> wrote:
>
> In the smb2_send_interim_resp(), if ksmbd_alloc_work_struct()
> fails to allocate a node, it returns a NULL pointer to the
> in_work pointer. This can lead to an illegal memory write of
> in_work->response_buf when allocate_interim_rsp_buf() attempts
> to perform a kzalloc() on it.
>
> To address this issue, incorporating a check for the return
> value of ksmbd_alloc_work_struct() ensures that the function
> returns immediately upon allocation failure, thereby preventing
> the aforementioned illegal memory access.
>
> Fixes: 041bba4414cd ("ksmbd: fix wrong interim response on compound")
> Signed-off-by: Wentao Liang <liangwentao@iscas.ac.cn>
Applied it to #ksmbd-for-next-next.
Thanks!
diff mbox series

Patch

diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
index 599118aed205..6683ed3b7f18 100644
--- a/fs/smb/server/smb2pdu.c
+++ b/fs/smb/server/smb2pdu.c
@@ -695,6 +695,9 @@  void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status)
 	struct smb2_hdr *rsp_hdr;
 	struct ksmbd_work *in_work = ksmbd_alloc_work_struct();
 
+	if (!in_work)
+		return;
+
 	if (allocate_interim_rsp_buf(in_work)) {
 		pr_err("smb_allocate_rsp_buf failed!\n");
 		ksmbd_free_work_struct(in_work);