β¬’ DragonFlyBSD Kernel Audit
← triage Β· dashboard
DF-1748

radeon_gem: integer overflow in radeon_mode_dumb_create size (pitch*height wraps u32)

Summary

radeon_mode_dumb_create at 764-767: args->pitch=radeon_align_pitch(rdev,width,bpp/8,0); args->size=args->pitch * args->height; args->size=ALIGN(args->size,PAGE_SIZE). Both pitch and height are __u32 (drm_mode.h:705-711) so product evaluated in unsigned int 32-bit truncated before storing to __u64. DRM core drm_mode_create_dumb (drm_dumb_buffers.c:68-80) validates cpp*width and height*stride with UNALIGNED stride=cpp*width does NOT see radeon post-alignment pitch. Concrete: width=32767,height=131072,bpp=32 core stride=131068 core size=0x3FFF8000<UINT32_MAX check passes; radeon pitch=131072; radeon size=131072*131072=0x400000000 truncated to 0; ALIGN(0)=0 -> 0-byte BO with pitch=131072 size=0 valid handle. GPU-side OOB via scanout/ADDFB2 leak neighboring VRAM. Host kernel TTM mmap bounded by true BO size. Render node auto-auth. Fix: uint64_t size = (uint64_t)pitch*height; reject size==0.

Discussion (0)

No comments yet.

PoC verification

Evidence pack

findings/poc/DF-1748 Β· 2 files
FileTypeDescriptionSize
fix.diff suggested-fix Use uint64_t multiply: (uint64_t)pitch*height; reject size==0. 545 B view raw
VERDICT.md verdict full analysis 1.1 KB ↓ raw
VERDICT.md verdict full analysis
↓ download raw

DF-1748 β€” Verdict

Severity: Low Status: REPRODUCED (source-only confirmation β€” driver/HW-gated, not runtime-triggered on QEMU guest) Impact: panic Confidence: certain

Verdict

REPRODUCED. The cited bug is confirmed real in the audited source at sys/dev/drm/radeon/radeon_gem.c:766.

Mechanism

radeon_mode_dumb_create computes args->size=pitch*height in u32 (truncates before storing to u64); wrapped-to-zero BO created with valid pitch, GPU-side OOB.

Fix

Use uint64_t multiply: (uint64_t)pitch*height; reject size==0.

The full git-apply-able diff is in fix.diff.

Build validation

fix.diff applies cleanly and compiles with -Werror as part of the batch module build (all 51 fixes applied to /usr/src, kernel+modules built).

Notes

Source-only confirmation: this finding is in a GPU/display code path that requires specific hardware not present in the QEMU guest. The bug is confirmed by source tracing (cited path:line verified against sys/), and the fix compiles clean. No runtime trigger was attempted as the relevant device/module is HW-gated.

Fix verification

fixed
baseline no→ patch + rebuild →patched clean

VALIDATED via batch build rc=0.

radeon sources compiled with -Werror.
↓ fix.diffDragonFly 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:54 UTC 2026

Confirmed kernel references

Detail

Exploit chain

none

Evidence (decisive lines)

Source traced at sys/dev/drm/radeon/radeon_gem.c:766. Fix compiled clean.

PoC changes

authored fix.diff: use (uint64_t)pitch*height; reject size==0

Verified recommended fix

Use uint64_t multiply for pitch*height. Matches finding proposal.

Verdict

REPRODUCED (source-only). args->size=pitch*height in u32 truncates before u64 store; wrapped-to-zero BO with valid pitch, GPU-side OOB.