ACPI, APEI, HEST Fix the unsuitable usage of platform_data.
PATCH 2/2 ACPI, APEI, HEST Fix the unsuitable usage of platform_data.
platform_data in hest_parse_ghes() is used for saving the address of entry information of erst_tab. When the device is failed to be added, platform_data will be freed by platform_device_put(). But the value saved in platform_data should not be freed here. If it is done, it will make system panic.
So I think platform_data should save the address of allocated memory which saves entry information of erst_tab.
This patch fixed it and I confirmed it on x86_64 next-tree.
--- drivers/acpi/apei/ghes.c | 2 +- drivers/acpi/apei/hest.c | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-)
drivers/acpi/apei/ghes.c +1 -1
@@ -302,7 +302,7 @@ static int __devinit ghes_probe(struct platform_device *ghes_dev)struct ghes *ghes =NULL ;int rc = -EINVAL ; - generic = ghes_dev->dev.platform_data; + generic = *(struct acpi_hest_generic **)ghes_dev->dev.platform_data;if (!generic->enabled)return -ENODEV ;
drivers/acpi/apei/hest.c +7 -4
@@ -137,20 +137,23 @@ static int hest_parse_ghes_count(struct acpi_hest_header *hest_hdr, void *data)static int hest_parse_ghes (struct acpi_hest_header *hest_hdr,void *data) { -struct acpi_hest_generic *generic;struct platform_device *ghes_dev;struct ghes_arr *ghes_arr = data;int rc;if (hest_hdr->type !=ACPI_HEST_TYPE_GENERIC_ERROR )return 0 ; - generic = (struct acpi_hest_generic *)hest_hdr; -if (!generic->enabled) + +if (!((struct acpi_hest_generic *)hest_hdr)->enabled)return 0 ; ghes_dev =platform_device_alloc ("GHES" , hest_hdr->source_id);if (!ghes_dev)return -ENOMEM ; - ghes_dev->dev.platform_data = generic; + + rc =platform_device_add_data (ghes_dev, &hest_hdr,sizeof (void *)); +if (rc) + goto err; + rc =platform_device_add (ghes_dev);if (rc) goto err;
Signature · 1 line
1.7.1.1
Quoted 11 lines · Jin Dongming
platform_datainhest_parse_ghes()is used for saving the address of entry information oferst_tab. When the device is failed to be added,platform_datawill be freed byplatform_device_put(). But the value saved inplatform_datashould not be freed here. If it is done, it will make system panic.So I think
platform_datashould save the address of allocated memory which saves entry information oferst_tab.This patch fixed it and I confirmed it on
x86_64next-tree.Signed-off-by Jin Dongming <[email protected]>
Best Regards,
Huang Ying