mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 15:12:13 +02:00
drm/amd/display: Fix integer overflow in bios_get_image()
[Why&How] The bounds check in bios_get_image() computes 'offset + size' using unsigned 32-bit arithmetic before comparing against bios_size. If a VBIOS image contains a near-UINT32_MAX offset the addition wraps to a small value, the comparison passes, and the function returns a wild pointer past the VBIOS mapping. Additionally, the comparison uses '<' (strict), which incorrectly rejects the valid exact-fit case where offset + size == bios_size. Fix both issues by restructuring the check to avoid the addition entirely: first reject if offset alone exceeds bios_size, then check size against the remaining space (bios_size - offset). This eliminates the overflow and correctly permits exact-fit accesses. Assisted-by: GitHub Copilot:claude-opus-4.6 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commit d40fb392af659c4a02b560319f226842f6ec1a95) Cc: stable@vger.kernel.org
This commit is contained in:
parent
6dc2c49a70
commit
cd86529ec6
|
|
@ -37,10 +37,13 @@ uint8_t *bios_get_image(struct dc_bios *bp,
|
|||
uint32_t offset,
|
||||
uint32_t size)
|
||||
{
|
||||
if (bp->bios && offset + size < bp->bios_size)
|
||||
return bp->bios + offset;
|
||||
else
|
||||
if (!bp->bios)
|
||||
return NULL;
|
||||
|
||||
if (offset > bp->bios_size || size > bp->bios_size - offset)
|
||||
return NULL;
|
||||
|
||||
return bp->bios + offset;
|
||||
}
|
||||
|
||||
#include "reg_helper.h"
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user