diff options
author | Xiang Wang <merle@hardenedlinux.org> | 2020-03-19 03:15:47 +0000 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2020-03-19 10:16:17 +0530 |
commit | a0c88ddb31ec5ce43f1dd8759a918ea590429176 (patch) | |
tree | fd013050434d5764d1b3b172c3cf19ad6704d5b6 | |
parent | 315a87710fd16009ad709445d5cf55cc6cca2e69 (diff) |
lib: Fix sbi_ecall_register_extension to prevent extension IDs overlap
The original code does not prevent the following scenarios:
> sbi_ecall_register_extension(ext1); /* extension id (70-80) */
> sbi_ecall_register_extension(ext2); /* extension id (50-100) */
Signed-off-by: Xiang Wang <merle@hardenedlinux.org>
Reviewed-by: Anup Patel <anup.patel@wdc.com>
-rw-r--r-- | lib/sbi/sbi_ecall.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/sbi/sbi_ecall.c b/lib/sbi/sbi_ecall.c index 6d7b152..6acb1b7 100644 --- a/lib/sbi/sbi_ecall.c +++ b/lib/sbi/sbi_ecall.c @@ -40,11 +40,19 @@ struct sbi_ecall_extension *sbi_ecall_find_extension(unsigned long extid) int sbi_ecall_register_extension(struct sbi_ecall_extension *ext) { + struct sbi_ecall_extension *t; + if (!ext || (ext->extid_end < ext->extid_start) || !ext->handle) return SBI_EINVAL; - if (sbi_ecall_find_extension(ext->extid_start) || - sbi_ecall_find_extension(ext->extid_end)) - return SBI_EINVAL; + + sbi_list_for_each_entry(t, &ecall_exts_list, head) { + unsigned long start = t->extid_start; + unsigned long end = t->extid_end; + if (end < ext->extid_start || ext->extid_end < start) + /* no overlap */; + else + return SBI_EINVAL; + } SBI_INIT_LIST_HEAD(&ext->head); sbi_list_add_tail(&ext->head, &ecall_exts_list); |