aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2020-12-27 17:28:32 +0000
committerKyle Evans <kevans@FreeBSD.org>2021-01-10 05:58:43 +0000
commit63882ce21586f6904ae4faf9dbbf73b560378773 (patch)
tree71660f994fa1b021060bb5efd453cd33e25db2ed
parentf6be8e5155195f5eeac763fa24d6afa2d5417fa0 (diff)
downloadsrc-63882ce21586f6904ae4faf9dbbf73b560378773.tar.gz
src-63882ce21586f6904ae4faf9dbbf73b560378773.zip
kern: efirt: enter runtime environment to deref efi_cfgtbl
This fixes an insta-panic when EFIIOC_GET_TABLE is used. (cherry picked from commit 0861c7d3e048556841fa5085173660dceadc5646)
-rw-r--r--sys/dev/efidev/efirt.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/dev/efidev/efirt.c b/sys/dev/efidev/efirt.c
index ccbae5701e18..9eaaba9801fd 100644
--- a/sys/dev/efidev/efirt.c
+++ b/sys/dev/efidev/efirt.c
@@ -285,18 +285,25 @@ efi_get_table(struct uuid *uuid, void **ptr)
{
struct efi_cfgtbl *ct;
u_long count;
+ int error;
if (efi_cfgtbl == NULL || efi_systbl == NULL)
return (ENXIO);
+ error = efi_enter();
+ if (error != 0)
+ return (error);
count = efi_systbl->st_entries;
ct = efi_cfgtbl;
while (count--) {
if (!bcmp(&ct->ct_uuid, uuid, sizeof(*uuid))) {
*ptr = (void *)efi_phys_to_kva(ct->ct_data);
+ efi_leave();
return (0);
}
ct++;
}
+
+ efi_leave();
return (ENOENT);
}