[Sound-open-firmware] [PATCH 1/3] rimage: validate manifest segments

Liam Girdwood liam.r.girdwood at linux.intel.com
Tue Feb 27 17:42:05 CET 2018


make sure no manifest segments collide with each other and fail if they
do.

Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
 rimage/manifest.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/rimage/manifest.c b/rimage/manifest.c
index 2b7e07f..b9848d0 100644
--- a/rimage/manifest.c
+++ b/rimage/manifest.c
@@ -260,6 +260,62 @@ static int man_get_module_manifest(struct image *image, struct module *module,
 	return 0;
 }
 
+static inline const char *segment_name(int i)
+{
+	switch (i) {
+	case SOF_MAN_SEGMENT_TEXT:
+		return "TEXT";
+	case SOF_MAN_SEGMENT_RODATA:
+		return "DATA";
+	case SOF_MAN_SEGMENT_BSS:
+		return "BSS";
+	default:
+		return "NONE";
+	}
+}
+
+/* make sure no segments collide */
+static int man_module_validate(struct sof_man_module *man_module)
+{
+	uint32_t istart, iend;
+	uint32_t jstart, jend;
+	int i, j;
+
+	for (i = 0; i < 3; i++) {
+
+		istart = man_module->segment[i].v_base_addr;
+		iend = istart + man_module->segment[i].flags.r.length *
+			MAN_PAGE_SIZE;
+
+		for (j = 0; j < 3; j++) {
+
+			/* don't validate segment against itself */
+			if (i == j)
+				continue;
+
+			jstart = man_module->segment[j].v_base_addr;
+			jend = jstart + man_module->segment[j].flags.r.length *
+				MAN_PAGE_SIZE;
+
+			if (jstart > istart && jstart < iend)
+				goto err;
+
+			if (jend > istart && jend < iend)
+				goto err;
+		}
+	}
+
+	/* success, no overlapping segments */
+	return 0;
+
+err:
+	fprintf(stderr, "error: segment %s [0x%8.8x:0x%8.8x] overlaps",
+		segment_name(i), istart, iend);
+	fprintf(stderr, " with %s [0x%8.8x:0x%8.8x]\n",
+		segment_name(j), jstart, jend);
+	return -EINVAL;
+}
+
 static int man_module_create(struct image *image, struct module *module,
 	struct sof_man_module *man_module)
 {
@@ -328,6 +384,10 @@ static int man_module_create(struct image *image, struct module *module,
 
 	fprintf(stdout, "\tNo\tAddress\t\tSize\tFile\tType\n");
 
+	/* validate segments */
+	if (man_module_validate(man_module) < 0)
+		return -EINVAL;
+
 	/* find all sections and copy to corresponding segments */
 	for (i = 0; i < module->hdr.e_shnum; i++) {
 
-- 
2.14.1



More information about the Sound-open-firmware mailing list