]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/uverbs: Validate wqe_size before using it in ib_uverbs_post_send
authorYi Liu <liuy22@mails.tsinghua.edu.cn>
Thu, 22 Jan 2026 14:29:00 +0000 (22:29 +0800)
committerLeon Romanovsky <leon@kernel.org>
Mon, 26 Jan 2026 12:57:44 +0000 (07:57 -0500)
ib_uverbs_post_send() uses cmd.wqe_size from userspace without any
validation before passing it to kmalloc() and using the allocated
buffer as struct ib_uverbs_send_wr.

If a user provides a small wqe_size value (e.g., 1), kmalloc() will
succeed, but subsequent accesses to user_wr->opcode, user_wr->num_sge,
and other fields will read beyond the allocated buffer, resulting in
an out-of-bounds read from kernel heap memory. This could potentially
leak sensitive kernel information to userspace.

Additionally, providing an excessively large wqe_size can trigger a
WARNING in the memory allocation path, as reported by syzkaller.

This is inconsistent with ib_uverbs_unmarshall_recv() which properly
validates that wqe_size >= sizeof(struct ib_uverbs_recv_wr) before
proceeding.

Add the same validation for ib_uverbs_post_send() to ensure wqe_size
is at least sizeof(struct ib_uverbs_send_wr).

Fixes: c3bea3d2dc53 ("RDMA/uverbs: Use the iterator for ib_uverbs_unmarshall_recv()")
Signed-off-by: Yi Liu <liuy22@mails.tsinghua.edu.cn>
Link: https://patch.msgid.link/20260122142900.2356276-2-liuy22@mails.tsinghua.edu.cn
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/core/uverbs_cmd.c

index ce16404cdfb8cca3db9f35ecf944b8bc41cbcbc4..3259e9848cc79906f9beb57a97c51aac0845c535 100644 (file)
@@ -2049,7 +2049,10 @@ static int ib_uverbs_post_send(struct uverbs_attr_bundle *attrs)
        if (ret)
                return ret;
 
-       user_wr = kmalloc(cmd.wqe_size, GFP_KERNEL);
+       if (cmd.wqe_size < sizeof(struct ib_uverbs_send_wr))
+               return -EINVAL;
+
+       user_wr = kmalloc(cmd.wqe_size, GFP_KERNEL | __GFP_NOWARN);
        if (!user_wr)
                return -ENOMEM;