Fix bug in manifest uint32list parsing
The uint32list_get_next() function returned both its uint32_t result and
enum manifest_return_code as its result. This could result in a a
parsing error going unnoticed and polluting SMC whitelist.
Change-Id: I36871b46daaaed5586a1386bfb27303809cea218
diff --git a/src/manifest.c b/src/manifest.c
index bbff8a5..7a8474b 100644
--- a/src/manifest.c
+++ b/src/manifest.c
@@ -217,7 +217,8 @@
return memiter_size(&list->mem_it) > 0;
}
-static uint32_t uint32list_get_next(struct uint32list_iter *list)
+static enum manifest_return_code uint32list_get_next(
+ struct uint32list_iter *list, uint32_t *out)
{
const char *mem_base = memiter_base(&list->mem_it);
uint64_t num;
@@ -229,7 +230,8 @@
}
memiter_advance(&list->mem_it, sizeof(uint32_t));
- return num;
+ *out = (uint32_t)num;
+ return MANIFEST_SUCCESS;
}
static bool stringlist_has_next(const struct stringlist_iter *list)
@@ -287,6 +289,7 @@
spci_vm_id_t vm_id)
{
struct uint32list_iter smcs;
+ size_t idx;
TRY(read_string(node, "debug_name", &vm->debug_name));
TRY(read_optional_string(node, "kernel_filename",
@@ -295,8 +298,8 @@
TRY(read_optional_uint32list(node, "smc_whitelist", &smcs));
while (uint32list_has_next(&smcs) &&
vm->smc_whitelist.smc_count < MAX_SMCS) {
- vm->smc_whitelist.smcs[vm->smc_whitelist.smc_count++] =
- uint32list_get_next(&smcs);
+ idx = vm->smc_whitelist.smc_count++;
+ TRY(uint32list_get_next(&smcs, &vm->smc_whitelist.smcs[idx]));
}
if (uint32list_has_next(&smcs)) {