Re: [PATCH 2/2] ksmbd: validate compression Flags before kvmalloc
ChenXiaoSong <[email protected]> Sat, 1 Aug 2026 18:00:54 +0800
| Newsgroups | org.kernel.vger.linux-cifs |
|---|---|
| Message-ID | <[email protected]> |
Reviewed-by: ChenXiaoSong <[email protected]> Fixes: a08de24c2b85 ("ksmbd: negotiate and decode SMB2 compression") 在 2026/8/1 13:19, Anatolii Shumak 写道: > ksmbd_decompress_request() allocated the decompressed request buffer > before smb_compression_decompress() rejected unknown transform Flags or > chained mode when it was not negotiated. A remote peer could force a > transient multi-megabyte allocation that was immediately freed on > -EINVAL. > > Validate CHAINED/NONE Flags and compress_chained before kvmalloc. > > Link: https://github.com/namjaejeon/ksmbd/issues/529 > Signed-off-by: Anatolii Shumak <[email protected]> > --- > fs/smb/server/compress.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/fs/smb/server/compress.c b/fs/smb/server/compress.c > index 821299888ad3..7e13cae705e2 100644 > --- a/fs/smb/server/compress.c > +++ b/fs/smb/server/compress.c > @@ -46,13 +46,22 @@ int ksmbd_decompress_request(struct ksmbd_conn *conn) > return -EINVAL; > > orig_size = le32_to_cpu(hdr->OriginalCompressedSegmentSize); > + /* > + * For chained transforms the top-level header is only eight bytes; the > + * Flags field overlays the first payload header. Reject unknown Flags > + * and unnegotiated chained mode before allocating the output buffer. > + */ > if (hdr->Flags == cpu_to_le16(SMB2_COMPRESSION_FLAG_CHAINED)) { > + if (!conn->compress_chained) > + return -EINVAL; > out_size = orig_size; > - } else { > + } else if (hdr->Flags == cpu_to_le16(SMB2_COMPRESSION_FLAG_NONE)) { > offset = le32_to_cpu(hdr->Offset); > if (offset > pdu_size - sizeof(*hdr) || > check_add_overflow(orig_size, offset, &out_size)) > return -EINVAL; > + } else { > + return -EINVAL; > } > > max_allowed_pdu_size = SMB3_MAX_MSGSIZE + conn->vals->max_write_size; -- ChenXiaoSong <[email protected]> Chinese Homepage: https://chenxiaosong.com English Homepage: https://chenxiaosong.com/en