FAILED: patch "[PATCH] ksmbd: fix out-of-bounds read when padding the final compound" failed to apply to 6.6-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x 714f27729121d59f103ca4dad7b0c2d1c125cd71
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026110341-crispness-repave-e347@gregkh' --subject-prefix 'PATCH 6.6.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 714f27729121d59f103ca4dad7b0c2d1c125cd71 Mon Sep 17 00:00:00 2001
From: Ian Bridges <[email protected]>
Date: Mon, 26 Oct 2026 20:40:21 -0500
Subject: [PATCH] ksmbd: fix out-of-bounds read when padding the final compound
response
Compound response handling pads the last response of a compound to an 8-byte boundary by growing the final iov and the RFC1002 length. smb2_allocate_rsp_buf() allocates exactly response_sz. A command can fill the response buffer to within 7 bytes of its end, for example a QUERY_INFO whose output is bounded only by the space left. The padding can then run past the allocation, and ksmbd_tcp_writev() reads those bytes when it sends the response.
BUG: KASAN: slab-out-of-bounds in _copy_from_iter+0x744/0x10e0 Call Trace: _copy_from_iter+0x744/0x10e0 tcp_sendmsg_locked+0x2290/0x3f80 ksmbd_tcp_writev+0x10c7/0x1ab0 [ksmbd]
Allocate room for the padding when the request is a compound, as smb2_read() and smb2_read_pipe() do for their payloads. response_sz is unchanged, so commands still fill only up to it, and kvzalloc() zeroes the padding.
fs/smb/server/smb2pdu.c +10 -3
@@ -969,7 +969,7 @@ int smb2_allocate_rsp_buf(struct ksmbd_work *work)struct smb_version_values *vals = work->conn->vals;size_t small_sz =MAX_CIFS_SMALL_BUFFER_SIZE ;size_t large_sz = small_sz + vals->max_trans_size; -size_t sz = small_sz; +size_t sz = small_sz, pad_sz =0 ;int cmd =le16_to_cpu (hdr->Command);if (cmd ==SMB2_IOCTL_HE || cmd ==SMB2_QUERY_DIRECTORY_HE )
@@ -995,10 +995,17 @@ int smb2_allocate_rsp_buf(struct ksmbd_work *work) }/* allocate large response buf for chained commands */ -if (le32_to_cpu (hdr->NextCommand) >0 ) +if (le32_to_cpu (hdr->NextCommand) >0 ) { sz = large_sz; +/* +* is_chained_smb2_message() pads the last response of a +* compound to 8 bytes, which can take it past response_sz. +* Leave room for the padding. kvzalloc() zeroes it. +*/ + pad_sz =ALIGN (sz -sizeof (__be32),8 ) - (sz -sizeof (__be32)); + } - work->response_buf =kvzalloc (sz,KSMBD_DEFAULT_GFP ); + work->response_buf =kvzalloc (sz + pad_sz,KSMBD_DEFAULT_GFP );if (!work->response_buf)return -ENOMEM ;
Sasha Levin
maintainerPATCH 1/1 ksmbd: fix out-of-bounds read when padding the final compound response
From: Ian Bridges <[email protected]>
[ Upstream commit 714f27729121d59f103ca4dad7b0c2d1c125cd71 ]
Compound response handling pads the last response of a compound to an 8-byte boundary by growing the final iov and the RFC1002 length. smb2_allocate_rsp_buf() allocates exactly response_sz. A command can fill the response buffer to within 7 bytes of its end, for example a QUERY_INFO whose output is bounded only by the space left. The padding can then run past the allocation, and ksmbd_tcp_writev() reads those bytes when it sends the response.
BUG: KASAN: slab-out-of-bounds in _copy_from_iter+0x744/0x10e0 Call Trace: _copy_from_iter+0x744/0x10e0 tcp_sendmsg_locked+0x2290/0x3f80 ksmbd_tcp_writev+0x10c7/0x1ab0 [ksmbd]
Allocate room for the padding when the request is a compound, as smb2_read() and smb2_read_pipe() do for their payloads. response_sz is unchanged, so commands still fill only up to it, and kvzalloc() zeroes the padding.
--- fs/smb/server/smb2pdu.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
fs/smb/server/smb2pdu.c +10 -3
@@ -538,7 +538,7 @@ int smb2_allocate_rsp_buf(struct ksmbd_work *work)struct smb2_hdr *hdr =smb_get_msg (work->request_buf);size_t small_sz =MAX_CIFS_SMALL_BUFFER_SIZE ;size_t large_sz = small_sz + work->conn->vals->max_trans_size; -size_t sz = small_sz; +size_t sz = small_sz, pad_sz =0 ;int cmd =le16_to_cpu (hdr->Command);if (cmd ==SMB2_IOCTL_HE || cmd ==SMB2_QUERY_DIRECTORY_HE )
@@ -560,10 +560,17 @@ int smb2_allocate_rsp_buf(struct ksmbd_work *work) }/* allocate large response buf for chained commands */ -if (le32_to_cpu (hdr->NextCommand) >0 ) +if (le32_to_cpu (hdr->NextCommand) >0 ) { sz = large_sz; +/* +* is_chained_smb2_message() pads the last response of a +* compound to 8 bytes, which can take it past response_sz. +* Leave room for the padding. kvzalloc() zeroes it. +*/ + pad_sz =ALIGN (sz -sizeof (__be32),8 ) - (sz -sizeof (__be32)); + } - work->response_buf =kvzalloc (sz,GFP_KERNEL ); + work->response_buf =kvzalloc (sz + pad_sz,GFP_KERNEL );if (!work->response_buf)return -ENOMEM ;
Signature · 1 line
2.53.0