fix(manifest): ignore memory regions with size 0
This patch modifies check_and_record_mem_regions() to return an error on
regions with size '0' when parsing a secure partition's manifest.
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Signed-off-by: J-Alves <joao.alves@arm.com>
Change-Id: I9d9ee97357440849ec51bd88db5296069abc322e
diff --git a/inc/hf/manifest.h b/inc/hf/manifest.h
index c7a6869..15f415d 100644
--- a/inc/hf/manifest.h
+++ b/inc/hf/manifest.h
@@ -249,6 +249,7 @@
MANIFEST_ERROR_MEMORY_REGION_NODE_EMPTY,
MANIFEST_ERROR_DEVICE_REGION_NODE_EMPTY,
MANIFEST_ERROR_RXTX_SIZE_MISMATCH,
+ MANIFEST_ERROR_MEM_REGION_EMPTY,
MANIFEST_ERROR_MEM_REGION_OVERLAP,
MANIFEST_ERROR_INVALID_MEM_PERM,
MANIFEST_ERROR_INTERRUPT_ID_REPEATED,
diff --git a/src/manifest.c b/src/manifest.c
index be9689a..4875e12 100644
--- a/src/manifest.c
+++ b/src/manifest.c
@@ -414,11 +414,18 @@
return MANIFEST_SUCCESS;
}
-static bool check_and_record_mem_regions(uintptr_t base_address,
- uint32_t page_count)
+static enum manifest_return_code check_and_record_mem_regions(
+ uintptr_t base_address, uint32_t page_count)
{
uintptr_t limit = base_address + (page_count * PAGE_SIZE) - 1U;
+ if (page_count == 0U) {
+ dlog_error(
+ "Empty memory region defined with base address: %x\n",
+ base_address);
+ return MANIFEST_ERROR_MEM_REGION_EMPTY;
+ }
+
for (size_t i = 0; i < allocated_mem_regions_index; i++) {
uintptr_t mem_region_base = manifest_data->mem_regions[i].base;
uintptr_t mem_region_limit =
@@ -433,7 +440,7 @@
"Overlapping region %#x - %#x\n",
base_address, limit, mem_region_base,
mem_region_limit);
- return false;
+ return MANIFEST_ERROR_MEM_REGION_OVERLAP;
}
}
@@ -442,7 +449,7 @@
manifest_data->mem_regions[allocated_mem_regions_index].limit = limit;
allocated_mem_regions_index++;
- return true;
+ return MANIFEST_SUCCESS;
}
static enum manifest_return_code parse_ffa_memory_region_node(
@@ -481,10 +488,8 @@
dlog_verbose(" Pages_count: %u\n",
mem_regions[i].page_count);
- if (!check_and_record_mem_regions(mem_regions[i].base_address,
- mem_regions[i].page_count)) {
- return MANIFEST_ERROR_MEM_REGION_OVERLAP;
- }
+ TRY(check_and_record_mem_regions(mem_regions[i].base_address,
+ mem_regions[i].page_count));
TRY(read_uint32(mem_node, "attributes",
&mem_regions[i].attributes));
@@ -1271,6 +1276,8 @@
return "Device-region node should have at least one entry";
case MANIFEST_ERROR_RXTX_SIZE_MISMATCH:
return "RX and TX buffers should be of same size";
+ case MANIFEST_ERROR_MEM_REGION_EMPTY:
+ return "Memory region should have at least one page";
case MANIFEST_ERROR_MEM_REGION_OVERLAP:
return "Memory region overlaps with one already allocated";
case MANIFEST_ERROR_INVALID_MEM_PERM:
diff --git a/src/manifest_test.cc b/src/manifest_test.cc
index 04d97cf..e5d03d6 100644
--- a/src/manifest_test.cc
+++ b/src/manifest_test.cc
@@ -1132,6 +1132,38 @@
MANIFEST_ERROR_PROPERTY_NOT_FOUND);
manifest_dealloc();
+ /* Empty memory region */
+ /* clang-format off */
+ dtb = ManifestDtBuilder()
+ .FfaValidManifest()
+ .StartChild("memory-regions")
+ .Compatible({ "arm,ffa-manifest-memory-regions" })
+ .Label("rx")
+ .StartChild("rx")
+ .Description("rx-buffer")
+ .Property("base-address", "<0x7300000>")
+ .Property("pages-count", "<0>")
+ .Property("attributes", "<1>")
+ .EndChild()
+ .Label("tx")
+ .StartChild("tx")
+ .Description("tx-buffer")
+ .Property("base-address", "<0x7310000>")
+ .Property("pages-count", "<2>")
+ .Property("attributes", "<3>")
+ .EndChild()
+ .EndChild()
+ .StartChild("rx_tx-info")
+ .Compatible({ "arm,ffa-manifest-rx_tx-buffer" })
+ .Property("rx-buffer", "<&rx>")
+ .Property("tx-buffer", "<&tx>")
+ .EndChild()
+ .Build();
+ /* clang-format on */
+ ASSERT_EQ(ffa_manifest_from_vec(&m, dtb),
+ MANIFEST_ERROR_MEM_REGION_EMPTY);
+ manifest_dealloc();
+
/* Overlapping memory regions */
/* clang-format off */
dtb = ManifestDtBuilder()