mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-12 20:46:49 +07:00
firmware: vpd: Fix section enabled flag on vpd_section_destroy
static struct ro_vpd and rw_vpd are initialized by vpd_sections_init() in vpd_probe() based on header's ro and rw sizes. In vpd_remove() vpd_section_destroy() performs deinitialization based on enabled flag, which is set to true by vpd_sections_init(). This leads to call of vpd_section_destroy() on already destroyed section for probe-release-probe-release sequence if first probe performs ro_vpd initialization and second probe does not initialize it. The patch adds changing enabled flag on vpd_section_destroy and adds cleanup on the error path of vpd_sections_init. Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Anton Vasilyev <vasilyev@ispras.ru> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
9a481bdc16
commit
45ca3f76de
@ -246,6 +246,7 @@ static int vpd_section_destroy(struct vpd_section *sec)
|
|||||||
sysfs_remove_bin_file(vpd_kobj, &sec->bin_attr);
|
sysfs_remove_bin_file(vpd_kobj, &sec->bin_attr);
|
||||||
kfree(sec->raw_name);
|
kfree(sec->raw_name);
|
||||||
memunmap(sec->baseaddr);
|
memunmap(sec->baseaddr);
|
||||||
|
sec->enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -279,8 +280,10 @@ static int vpd_sections_init(phys_addr_t physaddr)
|
|||||||
ret = vpd_section_init("rw", &rw_vpd,
|
ret = vpd_section_init("rw", &rw_vpd,
|
||||||
physaddr + sizeof(struct vpd_cbmem) +
|
physaddr + sizeof(struct vpd_cbmem) +
|
||||||
header.ro_size, header.rw_size);
|
header.ro_size, header.rw_size);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
vpd_section_destroy(&ro_vpd);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user