From a0c88ddb31ec5ce43f1dd8759a918ea590429176 Mon Sep 17 00:00:00 2001 From: Xiang Wang Date: Thu, 19 Mar 2020 03:15:47 +0000 Subject: 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 Reviewed-by: Anup Patel --- lib/sbi/sbi_ecall.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'lib/sbi/sbi_ecall.c') 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); -- cgit v1.2.3