Fix strncpy length in SP config loader
The length parameter of strncpy calls in sp_config_loader.c do not
account for the terminating null character which can cause unterminated
strings and compiler error in release build. Decrease length by one to
solve the issue.
Signed-off-by: Imre Kis <imre.kis@arm.com>
Change-Id: I1540d038482ed1ac98e2c400359516f6fd287086
diff --git a/components/config/loader/sp/sp_config_loader.c b/components/config/loader/sp/sp_config_loader.c
index 5c7c552..760326b 100644
--- a/components/config/loader/sp/sp_config_loader.c
+++ b/components/config/loader/sp/sp_config_loader.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
- * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2024, Arm Limited and Contributors. All rights reserved.
*/
#include <common/fdt/fdt_helpers.h>
@@ -34,10 +34,11 @@
/* Iterate over the device regions */
while ((uintptr_t)d < (value_pair->value + value_pair->size)) {
- struct device_region device_region;
+ struct device_region device_region = { 0 };
strncpy(device_region.dev_class, d->name,
- sizeof(device_region.dev_class));
+ sizeof(device_region.dev_class) - 1);
+ device_region.dev_class[sizeof(device_region.dev_class) - 1] = '\0';
device_region.dev_instance = 0;
device_region.base_addr = d->location;
device_region.io_region_size = d->size;
@@ -63,10 +64,11 @@
/* Iterate over the device regions */
while ((uintptr_t)d < (value_pair->value + value_pair->size)) {
- struct memory_region memory_region;
+ struct memory_region memory_region = { 0 };
strncpy(memory_region.region_name, d->name,
- sizeof(memory_region.region_name));
+ sizeof(memory_region.region_name) - 1);
+ memory_region.region_name[sizeof(memory_region.region_name) - 1] = '\0';
memory_region.base_addr = d->location;
memory_region.region_size = d->size;
@@ -155,7 +157,8 @@
}
strncpy(memory_region.region_name, subnode_name,
- sizeof(memory_region.region_name));
+ sizeof(memory_region.region_name) - 1);
+ memory_region.region_name[sizeof(memory_region.region_name) - 1] = '\0';
memory_region.base_addr = (uintptr_t)base_addr;
memory_region.region_size = page_cnt * FFA_SP_MANIFEST_PAGE_SIZE;
@@ -193,7 +196,8 @@
}
strncpy(device_region.dev_class, subnode_name,
- sizeof(device_region.dev_class));
+ sizeof(device_region.dev_class) - 1);
+ device_region.dev_class[sizeof(device_region.dev_class) - 1] = '\0';
device_region.base_addr = base_addr;
device_region.io_region_size = page_cnt * FFA_SP_MANIFEST_PAGE_SIZE;
device_region.dev_instance = 0;