Commit bb62fec9 authored by Mario Limonciello's avatar Mario Limonciello Committed by Xia Fukun
Browse files

drm/amd: Guard against bad data for ATIF ACPI method

stable inclusion
from stable-v4.19.323
commit 58556dcbd5606a5daccaee73b2130bc16b48e025
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IB2BX5
CVE: CVE-2024-50117

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-4.19.y&id=58556dcbd5606a5daccaee73b2130bc16b48e025



--------------------------------

commit bf58f03931fdcf7b3c45cb76ac13244477a60f44 upstream.

If a BIOS provides bad data in response to an ATIF method call
this causes a NULL pointer dereference in the caller.

```
? show_regs (arch/x86/kernel/dumpstack.c:478 (discriminator 1))
? __die (arch/x86/kernel/dumpstack.c:423 arch/x86/kernel/dumpstack.c:434)
? page_fault_oops (arch/x86/mm/fault.c:544 (discriminator 2) arch/x86/mm/fault.c:705 (discriminator 2))
? do_user_addr_fault (arch/x86/mm/fault.c:440 (discriminator 1) arch/x86/mm/fault.c:1232 (discriminator 1))
? acpi_ut_update_object_reference (drivers/acpi/acpica/utdelete.c:642)
? exc_page_fault (arch/x86/mm/fault.c:1542)
? asm_exc_page_fault (./arch/x86/include/asm/idtentry.h:623)
? amdgpu_atif_query_backlight_caps.constprop.0 (drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c:387 (discriminator 2)) amdgpu
? amdgpu_atif_query_backlight_caps.constprop.0 (drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c:386 (discriminator 1)) amdgpu
```

It has been encountered on at least one system, so guard for it.

Fixes: d38ceaf9 ("drm/amdgpu: add core driver (v4)")
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
(cherry picked from commit c9b7c809b89f24e9372a4e7f02d64c950b07fdee)
Cc: stable@vger.kernel.org
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarXia Fukun <xiafukun@huawei.com>
parent 4c37b644
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ static union acpi_object *amdgpu_atif_call(struct amdgpu_atif *atif,
					   struct acpi_buffer *params)
{
	acpi_status status;
	union acpi_object *obj;
	union acpi_object atif_arg_elements[2];
	struct acpi_object_list atif_arg;
	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
@@ -112,16 +113,24 @@ static union acpi_object *amdgpu_atif_call(struct amdgpu_atif *atif,

	status = acpi_evaluate_object(atif->handle, NULL, &atif_arg,
				      &buffer);
	obj = (union acpi_object *)buffer.pointer;

	/* Fail only if calling the method fails and ATIF is supported */
	/* Fail if calling the method fails and ATIF is supported */
	if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
		DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n",
				 acpi_format_exception(status));
		kfree(buffer.pointer);
		kfree(obj);
		return NULL;
	}

	return buffer.pointer;
	if (obj->type != ACPI_TYPE_BUFFER) {
		DRM_DEBUG_DRIVER("bad object returned from ATIF: %d\n",
				 obj->type);
		kfree(obj);
		return NULL;
	}

	return obj;
}

/**