Skip to content

Commit 1956f0a

Browse files
liuyi-thurleon
authored andcommitted
RDMA/uverbs: Validate wqe_size before using it in ib_uverbs_post_send
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: c3bea3d ("RDMA/uverbs: Use the iterator for ib_uverbs_unmarshall_recv()") Signed-off-by: Yi Liu <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Leon Romanovsky <[email protected]>
1 parent 2529aea commit 1956f0a

1 file changed

Lines changed: 4 additions & 1 deletion

File tree

drivers/infiniband/core/uverbs_cmd.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2049,7 +2049,10 @@ static int ib_uverbs_post_send(struct uverbs_attr_bundle *attrs)
20492049
if (ret)
20502050
return ret;
20512051

2052-
user_wr = kmalloc(cmd.wqe_size, GFP_KERNEL);
2052+
if (cmd.wqe_size < sizeof(struct ib_uverbs_send_wr))
2053+
return -EINVAL;
2054+
2055+
user_wr = kmalloc(cmd.wqe_size, GFP_KERNEL | __GFP_NOWARN);
20532056
if (!user_wr)
20542057
return -ENOMEM;
20552058

0 commit comments

Comments
 (0)