aboutsummaryrefslogtreecommitdiff
path: root/stand/efi/loader
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-08-26 21:46:48 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-08-27 16:49:01 +0000
commitb54eec8366605d9c2303277cf2ab4b605289910a (patch)
tree091b305b3521a2910efac076f7c5818aaef3fedb /stand/efi/loader
parentb850806921a735f3f307bc4b2634c7e9008f5a9c (diff)
downloadsrc-b54eec8366605d9c2303277cf2ab4b605289910a.tar.gz
src-b54eec8366605d9c2303277cf2ab4b605289910a.zip
efi loader: disallow user to configure staging area size less than default
We need to round it up to 2M, for instance. Having staging area too small might cause the first resize to use negative size for memmove()/memcpy(), which kills loader. Tested by: Harry Schmalzbauer <freebsd@omnilan.de> Sponsored by: The FreeBSD Foundation MFC after: 1 week
Diffstat (limited to 'stand/efi/loader')
-rw-r--r--stand/efi/loader/copy.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/stand/efi/loader/copy.c b/stand/efi/loader/copy.c
index 65f595c12b11..2552ae86d966 100644
--- a/stand/efi/loader/copy.c
+++ b/stand/efi/loader/copy.c
@@ -178,12 +178,13 @@ out:
}
#endif /* __i386__ || __amd64__ */
-#ifndef EFI_STAGING_SIZE
#if defined(__arm__)
-#define EFI_STAGING_SIZE 32
+#define DEFAULT_EFI_STAGING_SIZE 32
#else
-#define EFI_STAGING_SIZE 64
+#define DEFAULT_EFI_STAGING_SIZE 64
#endif
+#ifndef EFI_STAGING_SIZE
+#define EFI_STAGING_SIZE DEFAULT_EFI_STAGING_SIZE
#endif
#if defined(__aarch64__) || defined(__amd64__) || defined(__arm__) || \
@@ -314,8 +315,12 @@ efi_copy_init(void)
{
EFI_STATUS status;
unsigned long nr_pages;
+ vm_offset_t ess;
- nr_pages = EFI_SIZE_TO_PAGES(M(1) * (EFI_STAGING_SIZE));
+ ess = EFI_STAGING_SIZE;
+ if (ess < DEFAULT_EFI_STAGING_SIZE)
+ ess = DEFAULT_EFI_STAGING_SIZE;
+ nr_pages = EFI_SIZE_TO_PAGES(M(1) * ess);
#if defined(__i386__) || defined(__amd64__)
/*