* [PATCH] drm/nouveau/nv04: check cursor buffer object size before upload
@ 2026-08-13 10:35 Zhenhao Wan
2026-08-18 18:24 ` lyude
0 siblings, 1 reply; 2+ messages in thread
From: Zhenhao Wan @ 2026-08-13 10:35 UTC (permalink / raw)
To: Lyude Paul, Danilo Krummrich, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Dave Airlie,
Ben Skeggs
Cc: dri-devel, nouveau, linux-kernel, Yuhao Jiang, stable, Zhenhao Wan
nv04_crtc_cursor_set() validates only the 64x64 cursor geometry, not the
size of the backing GEM object, before nv11_cursor_upload() /
nv04_cursor_upload() read up to 64 * 64 * 4 = 16384 bytes from it via
nouveau_bo_rd32() at hardware-fixed offsets.
nv04 uses a legacy cursor_set callback with a NULL cursor plane, so
drm_mode_cursor_common() passes the raw handle to the driver without
building a drm_framebuffer; the framebuffer path's size check never runs.
A client with DRM master can thus supply an undersized GEM object and
trigger an out-of-bounds read, as nouveau_bo_map() only kmaps
PFN_UP(size) pages.
Reject undersized buffers before mapping, as gma500's
gma_crtc_cursor_set() does. The check precedes nouveau_bo_map(), so the
error path only drops the GEM reference via the existing 'out:' label.
Fixes: 6ee738610f41 ("drm/nouveau: Add DRM driver for NVIDIA GPUs")
Reported-by: Yuhao Jiang <danisjiang@gmail.com>
Assisted-by: Claude:claude-opus-5
Cc: stable@vger.kernel.org
Signed-off-by: Zhenhao Wan <whi4ed0g@gmail.com>
---
drivers/gpu/drm/nouveau/dispnv04/crtc.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/gpu/drm/nouveau/dispnv04/crtc.c b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
index 500fd77b87d1..0393025baa64 100644
--- a/drivers/gpu/drm/nouveau/dispnv04/crtc.c
+++ b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
@@ -1000,6 +1000,11 @@ nv04_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
return -ENOENT;
cursor = nouveau_gem_object(gem);
+ if (gem->size < width * height * 4) {
+ ret = -EINVAL;
+ goto out;
+ }
+
ret = nouveau_bo_map(cursor);
if (ret)
goto out;
---
base-commit: db2ddb87143519e20a95aa36c60b36107b736a58
change-id: 20260813-nouveau-nv04-cursor-oob-ad2b6001de3d
Best regards,
--
Zhenhao Wan <whi4ed0g@gmail.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] drm/nouveau/nv04: check cursor buffer object size before upload
2026-08-13 10:35 [PATCH] drm/nouveau/nv04: check cursor buffer object size before upload Zhenhao Wan
@ 2026-08-18 18:24 ` lyude
0 siblings, 0 replies; 2+ messages in thread
From: lyude @ 2026-08-18 18:24 UTC (permalink / raw)
To: Zhenhao Wan, Danilo Krummrich, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Dave Airlie,
Ben Skeggs
Cc: dri-devel, nouveau, linux-kernel, Yuhao Jiang, stable
On Thu, 2026-08-13 at 18:35 +0800, Zhenhao Wan wrote:
> struct drm_file *file_priv,
> return -ENOENT;
> cursor = nouveau_gem_object(gem);
>
> + if (gem->size < width * height * 4) {
> + ret = -EINVAL;
> + goto out;
> + }
> +
A good start - but width and/or height could be UINT32_MAX, so a caller
could still overflow width or height. Would you mind adding an overflow
multiply check?
> ret = nouveau_bo_map(cursor);
> if (ret)
> goto out;
>
> ---
> base-commit: db2ddb87143519e20a95aa36c60b36107b736a58
> change-id: 20260813-nouveau-nv04-cursor-oob-ad2b6001de3d
>
> Best regards,
> --
> Zhenhao Wan <whi4ed0g@gmail.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-08-18 18:24 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-13 10:35 [PATCH] drm/nouveau/nv04: check cursor buffer object size before upload Zhenhao Wan
2026-08-18 18:24 ` lyude
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®