Francois Toguo Fotso has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/30098
Change subject: Fix potential NULL pointer dereferences and memory leak. ......................................................................
Fix potential NULL pointer dereferences and memory leak.
Found-by: Klockwork BUG=None TEST=Boot to OS
Change-Id: I38a8910e68b7a8ce0e97ca4cdb9ef7f595c0e319 Signed-off-by: Francois Toguo francois.toguo.fotso@intel.com --- M src/arch/x86/acpi_device.c M src/arch/x86/acpigen.c M src/include/nhlt.h M src/lib/nhlt.c M src/soc/intel/common/nhlt.c 5 files changed, 17 insertions(+), 20 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/98/30098/1
diff --git a/src/arch/x86/acpi_device.c b/src/arch/x86/acpi_device.c index 48b7fee..12bd1ad 100644 --- a/src/arch/x86/acpi_device.c +++ b/src/arch/x86/acpi_device.c @@ -635,8 +635,10 @@ char *dp_count, *prop_count; int child_count = 0;
- if (!table || table->type != ACPI_DP_TYPE_TABLE) + if (!table || table->type != ACPI_DP_TYPE_TABLE) { + acpi_dp_free(table); return; + }
/* Name (name) */ acpigen_write_name(table->name); diff --git a/src/arch/x86/acpigen.c b/src/arch/x86/acpigen.c index 290893d..00aec60 100644 --- a/src/arch/x86/acpigen.c +++ b/src/arch/x86/acpigen.c @@ -286,6 +286,13 @@ int dotcount = 0, i; int dotpos = 0;
+ /* If we have a null pointer. Then we need to put a null + name (0x00). */ + if (!namepath) { + acpigen_emit_byte(ZERO_OP); + return; + } + /* We can start with a ''. */ if (namepath[0] == '\') { acpigen_emit_byte('\'); @@ -369,23 +376,6 @@ acpigen_pop_len(); }
-/* Method to notify all CPU cores */ -void acpigen_write_processor_cnot(const unsigned int number_of_cores) -{ - int core_id; - - acpigen_write_method("\_PR.CNOT", 1); - for (core_id = 0; core_id < number_of_cores; core_id++) { - char buffer[DEVICE_PATH_MAX]; - snprintf(buffer, sizeof(buffer), CONFIG_ACPI_CPU_STRING, - core_id); - acpigen_emit_byte(NOTIFY_OP); - acpigen_emit_namestring(buffer); - acpigen_emit_byte(ARG0_OP); - } - acpigen_pop_len(); -} - /* * Generate ACPI AML code for OperationRegion * Arg0: Pointer to struct opregion opreg = OPREGION(rname, space, offset, len) diff --git a/src/include/nhlt.h b/src/include/nhlt.h index a361ed8..5fdb191 100644 --- a/src/include/nhlt.h +++ b/src/include/nhlt.h @@ -57,6 +57,9 @@ /* Return the size of the NHLT table including APCI header. */ size_t nhlt_current_size(struct nhlt *nhlt);
+/* Frees the allocated resources/memory for NHLT table */ +void nhlt_free_resources(struct nhlt *nhlt); + /* * Helper functions for adding NHLT devices utilizing an nhlt_endp_descriptor * to drive the logic. diff --git a/src/lib/nhlt.c b/src/lib/nhlt.c index 5001c38..0db5f7d 100644 --- a/src/lib/nhlt.c +++ b/src/lib/nhlt.c @@ -279,7 +279,7 @@ return calc_size(nhlt) + sizeof(acpi_header_t); }
-static void nhlt_free_resources(struct nhlt *nhlt) +void nhlt_free_resources(struct nhlt *nhlt) { int i; int j; diff --git a/src/soc/intel/common/nhlt.c b/src/soc/intel/common/nhlt.c index a268ea6..5ecb641 100644 --- a/src/soc/intel/common/nhlt.c +++ b/src/soc/intel/common/nhlt.c @@ -30,8 +30,10 @@
gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
- if (gnvs == NULL) + if (gnvs == NULL) { + nhlt_free_resources(nhlt); return acpi_addr; + }
/* Update NHLT GNVS Data */ gnvs->nhla = (uintptr_t)acpi_addr;