From 9b0ead72d3115c5de66648917ea402e4654e179c Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Tue, 27 Feb 2018 16:35:10 +0000 Subject: [PATCH] rimage: validate manifest segments make sure no manifest segments collide with each other and fail if they do. Signed-off-by: Liam Girdwood --- rimage/manifest.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/rimage/manifest.c b/rimage/manifest.c index 2b7e07fd2..b9848d04d 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++) {