]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/komeda: fix integer overflow in AFBC framebuffer size check
authorAlexander Konyukhov <Alexander.Konyukhov@kaspersky.com>
Tue, 3 Feb 2026 13:48:46 +0000 (16:48 +0300)
committerLiviu Dudau <liviu.dudau@arm.com>
Thu, 5 Feb 2026 14:10:42 +0000 (14:10 +0000)
The AFBC framebuffer size validation calculates the minimum required
buffer size by adding the AFBC payload size to the framebuffer offset.
This addition is performed without checking for integer overflow.

If the addition oveflows, the size check may incorrectly succed and
allow userspace to provide an undersized drm_gem_object, potentially
leading to out-of-bounds memory access.

Add usage of check_add_overflow() to safely compute the minimum
required size and reject the framebuffer if an overflow is detected.
This makes the AFBC size validation more robust against malformed.

Found by Linux Verification Center (linuxtesting.org) with SVACE.

Fixes: 65ad2392dd6d ("drm/komeda: Added AFBC support for komeda driver")
Signed-off-by: Alexander Konyukhov <Alexander.Konyukhov@kaspersky.com>
Acked-by: Liviu Dudau <liviu.dudau@arm.com>
Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
Link: https://lore.kernel.org/r/20260203134907.1587067-1-Alexander.Konyukhov@kaspersky.com
drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c

index 3ca461eb0a243fddc5537e83b462778d15d6ffc0..3cb34d03f7f882ed494ed7533e48e32dc5e7248d 100644 (file)
@@ -4,6 +4,8 @@
  * Author: James.Qian.Wang <james.qian.wang@arm.com>
  *
  */
+#include <linux/overflow.h>
+
 #include <drm/drm_device.h>
 #include <drm/drm_fb_dma_helper.h>
 #include <drm/drm_gem.h>
@@ -93,7 +95,9 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, struct drm_file *file,
        kfb->afbc_size = kfb->offset_payload + n_blocks *
                         ALIGN(bpp * AFBC_SUPERBLK_PIXELS / 8,
                               AFBC_SUPERBLK_ALIGNMENT);
-       min_size = kfb->afbc_size + fb->offsets[0];
+       if (check_add_overflow(kfb->afbc_size, fb->offsets[0], &min_size)) {
+               goto check_failed;
+       }
        if (min_size > obj->size) {
                DRM_DEBUG_KMS("afbc size check failed, obj_size: 0x%zx. min_size 0x%llx.\n",
                              obj->size, min_size);