]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
ksmbd: fix UBSAN array-index-out-of-bounds in decode_compress_ctxt()
authorNamjae Jeon <linkinjeon@kernel.org>
Sun, 21 Jun 2026 12:21:01 +0000 (21:21 +0900)
committerSteve French <stfrench@microsoft.com>
Tue, 23 Jun 2026 01:15:06 +0000 (20:15 -0500)
commit474fd91f3828a89dd7dc0a862f77f14e9f9240ff
tree4afe5698cfb5f0f827a9f280465cce71226210f0
parent5a7f4d6d8e7fc9c3b67412f1b8e5b56c9aec21af
ksmbd: fix UBSAN array-index-out-of-bounds in decode_compress_ctxt()

decode_compress_ctxt() walks CompressionAlgorithms[] using the client
supplied CompressionAlgorithmCount. That field is declared in
struct smb2_compression_capabilities_context as a fixed 4-element array,
but the number of algorithms is actually variable and clients such as
Windows advertise more than four (e.g. LZ77, LZ77+Huffman, LZNT1,
Pattern_V1 and LZ4).

The on-wire context length is already validated, so the access is within
the received buffer, but indexing the statically sized [4] array makes
UBSAN report an out-of-bounds access:

  UBSAN: array-index-out-of-bounds in smb2pdu.c:1122:48
  index 4 is out of range for type '__le16 [4]'
  Call Trace:
   smb2_handle_negotiate+0xda7/0xde0 [ksmbd]
   ksmbd_smb_negotiate_common+0x27b/0x3e0 [ksmbd]
   smb2_negotiate_request+0x14/0x20 [ksmbd]
   handle_ksmbd_work+0x181/0x500 [ksmbd]

Walk the algorithms through a pointer so the fixed-array bounds check is
not applied, while keeping the existing length validation that bounds the
loop to the data actually received.

Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/server/smb2pdu.c