]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ksmbd: validate EaNameLength in smb2_get_ea()
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 6 Apr 2026 13:46:46 +0000 (15:46 +0200)
committerSteve French <stfrench@microsoft.com>
Sun, 12 Apr 2026 23:07:55 +0000 (18:07 -0500)
smb2_get_ea() reads ea_req->EaNameLength from the client request and
passes it directly to strncmp() as the comparison length without
verifying that the length of the name really is the size of the input
buffer received.

Fix this up by properly checking the size of the name based on the value
received and the overall size of the request, to prevent a later
strncmp() call to use the length as a "trusted" size of the buffer.
Without this check, uninitialized heap values might be slowly leaked to
the client.

Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: Steve French <smfrench@gmail.com>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Tom Talpey <tom@talpey.com>
Cc: linux-cifs@vger.kernel.org
Cc: <stable@kernel.org>
Assisted-by: gregkh_clanker_t1000
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/server/smb2pdu.c

index d0b05878757eb8eeb5eccbdbd59fc4ab2558fe6a..c61fcc88d6f2856d2c1f081f16bc99049d6464b6 100644 (file)
@@ -4717,6 +4717,11 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp,
 
                ea_req = (struct smb2_ea_info_req *)((char *)req +
                                                     le16_to_cpu(req->InputBufferOffset));
+
+               if (le32_to_cpu(req->InputBufferLength) <
+                   offsetof(struct smb2_ea_info_req, name) +
+                   ea_req->EaNameLength)
+                       return -EINVAL;
        } else {
                /* need to send all EAs, if no specific EA is requested*/
                if (le32_to_cpu(req->Flags) & SL_RETURN_SINGLE_ENTRY)