forked from Mirrors/opensbi
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>
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user