summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorFeifei Xu <Feifei.Xu@amd.com>2026-05-15 14:27:02 +0800
committerAlex Deucher <alexander.deucher@amd.com>2026-06-03 13:48:40 -0400
commit5ac01ec854079ac95733ac9a8f3eb694bbe8ff5a (patch)
treead218b5dd426cf5a3a1d511e3ea337b22f4f829b /drivers/gpu
parentac081deaf16a639ea7dff2f285fe421a33c1ade0 (diff)
downloadlwn-5ac01ec854079ac95733ac9a8f3eb694bbe8ff5a.tar.gz
lwn-5ac01ec854079ac95733ac9a8f3eb694bbe8ff5a.zip
drm/amdgpu: Add size guard before copy discovery binary
Fix the firmware blob copied into fixed-size buffer without length check. Signed-off-by: Feifei Xu <Feifei.Xu@amd.com> Reviewed-by: Le Ma <le.ma@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
index d5d044e7fca7..b52c9fcf3fc5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
@@ -396,6 +396,26 @@ static int amdgpu_discovery_read_binary_from_file(struct amdgpu_device *adev,
return r;
}
+ if (fw->size > adev->discovery.size) {
+ dev_err(adev->dev,
+ "ip discovery firmware \"%s\" too large (%zu > %u)\n",
+ fw_name, fw->size, adev->discovery.size);
+ release_firmware(fw);
+ return -EINVAL;
+ }
+
+ /* Ensure the firmware is at least large enough to contain the
+ * binary header fields.
+ */
+ if (fw->size < offsetof(struct binary_header, binary_size) +
+ sizeof(((struct binary_header *)0)->binary_size)) {
+ dev_err(adev->dev,
+ "ip discovery firmware \"%s\" too small (%zu)\n",
+ fw_name, fw->size);
+ release_firmware(fw);
+ return -EINVAL;
+ }
+
memcpy((u8 *)binary, (u8 *)fw->data, fw->size);
release_firmware(fw);