DragonFlyBSD Kernel Audit
DF-1950 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/drm/amd/amdgpu/amdgpu_bios.c b/sys/dev/drm/amd/amdgpu/amdgpu_bios.c
--- a/sys/dev/drm/amd/amdgpu/amdgpu_bios.c
+++ b/sys/dev/drm/amd/amdgpu/amdgpu_bios.c
@@ -262,6 +262,16 @@
 	}
 
 	obj = (ACPI_OBJECT *)buffer.Pointer;
+	/* The ACPI_OBJECT union reuses offset 8 for Integer.Value and
+	 * Buffer.Pointer/Length; reject non-Buffer returns. */
+	if (obj->Type != ACPI_TYPE_BUFFER) {
+		DRM_ERROR("ATRM returned non-buffer ACPI object (type=%d)\n",
+			  obj->Type);
+		AcpiOsFree(buffer.Pointer);
+		return -ENODEV;
+	}
+	if (offset + obj->Buffer.Length > ATRM_BIOS_PAGE)
+		obj->Buffer.Length = ATRM_BIOS_PAGE - offset;
 	memcpy(bios+offset, obj->Buffer.Pointer, obj->Buffer.Length);
 	len = obj->Buffer.Length;
 	AcpiOsFree(buffer.Pointer);