summaryrefslogtreecommitdiff
path: root/lib/sbi/sbi_ecall.c
diff options
context:
space:
mode:
authorXiang Wang <merle@hardenedlinux.org>2020-03-19 06:15:47 +0300
committerAnup Patel <anup@brainfault.org>2020-03-19 07:46:17 +0300
commita0c88ddb31ec5ce43f1dd8759a918ea590429176 (patch)
treefd013050434d5764d1b3b172c3cf19ad6704d5b6 /lib/sbi/sbi_ecall.c
parent315a87710fd16009ad709445d5cf55cc6cca2e69 (diff)
downloadopensbi-a0c88ddb31ec5ce43f1dd8759a918ea590429176.tar.xz
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>
Diffstat (limited to 'lib/sbi/sbi_ecall.c')
-rw-r--r--lib/sbi/sbi_ecall.c14
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);