FAILED: patch "[PATCH] smb: client: reject short READ responses in CIFSSMBRead()" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-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-5.10.y
git checkout FETCH_HEAD
git cherry-pick -x e6142a8bfc230c7263eb8b0475249c958ce49367
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026091606-quickstep-handstand-fba1@gregkh' --subject-prefix 'PATCH 5.10.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e6142a8bfc230c7263eb8b0475249c958ce49367 Mon Sep 17 00:00:00 2001
From: Diego Oliva <[email protected]>
Date: Wed, 2 Sep 2026 11:42:06 +0100
Subject: [PATCH] smb: client: reject short READ responses in CIFSSMBRead()
CIFSSMBRead() reads DataLengthHigh, DataLength and DataOffset out of the READ_RSP returned by the server without first checking that a whole READ_RSP was actually received. The length of the response is recorded in rsp_iov.iov_len, but nothing constrains it to be at least read_rsp_size before those fields are dereferenced.
A malicious or compromised SMB1 server can return a response shorter than the READ_RSP header, so that parsing the header itself reads past the end of the receive buffer. SMB1 is not negotiated by default; reaching this code requires an explicit vers=1.0 mount.
Reject the response unless it is at least read_rsp_size bytes long.
fs/smb/client/cifssmb.c +8 -0
@@ -1719,6 +1719,14 @@ CIFSSMBRead(const unsigned int xid, struct cifs_io_parms *io_parms, pSMBr = (READ_RSP *)rsp_iov.iov_base;if (rc) {cifs_dbg (VFS ,"Send error in read = %d\n" , rc); + }else if (rsp_iov.iov_len < tcon->ses->server->vals->read_rsp_size) { +/* check that the received response can hold a whole READ_RSP */ +cifs_dbg (FYI ,"%s: server returned short header. got=%zu expected=%zu\n" , + __func__, rsp_iov.iov_len, + tcon->ses->server->vals->read_rsp_size); + rc =smb_EIO2 (smb_eio_trace_read_rsp_short, + rsp_iov.iov_len, tcon->ses->server->vals->read_rsp_size); + *nbytes =0 ; }else {int data_length =le16_to_cpu (pSMBr->DataLengthHigh); data_length = data_length <<16 ;
Sasha Levin
maintainerPATCH 1/1 smb: client: reject short READ responses in CIFSSMBRead()
From: Diego Oliva <[email protected]>
[ Upstream commit e6142a8bfc230c7263eb8b0475249c958ce49367 ]
CIFSSMBRead() reads DataLengthHigh, DataLength and DataOffset out of the READ_RSP returned by the server without first checking that a whole READ_RSP was actually received. The length of the response is recorded in rsp_iov.iov_len, but nothing constrains it to be at least read_rsp_size before those fields are dereferenced.
A malicious or compromised SMB1 server can return a response shorter than the READ_RSP header, so that parsing the header itself reads past the end of the receive buffer. SMB1 is not negotiated by default; reaching this code requires an explicit vers=1.0 mount.
Reject the response unless it is at least read_rsp_size bytes long.
--- fs/cifs/cifssmb.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/cifs/cifssmb.c +7 -0
@@ -1806,6 +1806,13 @@ CIFSSMBRead(const unsigned int xid, struct cifs_io_parms *io_parms, pSMBr = (READ_RSP *)rsp_iov.iov_base;if (rc) {cifs_dbg (VFS ,"Send error in read = %d\n" , rc); + }else if (rsp_iov.iov_len < tcon->ses->server->vals->read_rsp_size) { +/* check that the received response can hold a whole READ_RSP */ +cifs_dbg (FYI ,"%s: server returned short header. got=%zu expected=%zu\n" , + __func__, rsp_iov.iov_len, + tcon->ses->server->vals->read_rsp_size); + rc = -EIO ; + *nbytes =0 ; }else {int data_length =le16_to_cpu (pSMBr->DataLengthHigh); data_length = data_length <<16 ;
Signature · 1 line
2.53.0