]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/core: Validate cpu_id against nr_cpu_ids in DMAH alloc
authorYishai Hadas <yishaih@nvidia.com>
Mon, 25 May 2026 14:21:36 +0000 (17:21 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Wed, 3 Jun 2026 17:55:48 +0000 (14:55 -0300)
The cpu_id attribute supplied by user space through
UVERBS_ATTR_ALLOC_DMAH_CPU_ID is passed directly to cpumask_test_cpu()
without first verifying that the value is within the valid CPU range.

Passing such untrusted data to cpumask_test_cpu() may lead to an
out-of-bounds read of the underlying cpumask bitmap: the helper expands
to a test_bit() that indexes the bitmap by cpu_id / BITS_PER_LONG with
no bound check.

In addition, on kernels built with CONFIG_DEBUG_PER_CPU_MAPS it trips
the WARN_ON_ONCE() in cpumask_check(); combined with panic_on_warn this
turns a bad user input into a machine reboot.

Reject any cpu_id that is not smaller than nr_cpu_ids with -EINVAL
before it is used.

Reported by Smatch.

Fixes: d83edab562a4 ("RDMA/core: Introduce a DMAH object and its alloc/free APIs")
Link: https://patch.msgid.link/r/20260525142136.28165-1-yishaih@nvidia.com
Cc: stable@vger.kernel.org
Reported-by: Dan Carpenter <error27@gmail.com>
Closes: https://lore.kernel.org/r/ag68qoAW3P04J7pT@stanley.mountain/
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/core/uverbs_std_types_dmah.c

index 453ce656c6f26e96f2bf9a9470b021f16ba3ca89..97101e0938263d114d6c1e398895bb8335915202 100644 (file)
@@ -47,6 +47,11 @@ static int UVERBS_HANDLER(UVERBS_METHOD_DMAH_ALLOC)(
                if (ret)
                        goto err;
 
+               if (dmah->cpu_id >= nr_cpu_ids) {
+                       ret = -EINVAL;
+                       goto err;
+               }
+
                if (!cpumask_test_cpu(dmah->cpu_id, current->cpus_ptr)) {
                        ret = -EPERM;
                        goto err;