71 lines
2.1 KiB
Diff
71 lines
2.1 KiB
Diff
From 14d63398298c8de23036a4cf61594108b7345863 Mon Sep 17 00:00:00 2001
|
|
From: Robbie Harwood <rharwood@redhat.com>
|
|
Date: Tue, 23 Aug 2022 12:07:16 -0400
|
|
Subject: [PATCH] Discard load-options that start with a NUL
|
|
|
|
In 6c8d08c0af4768c715b79c8ec25141d56e34f8b4 ("shim: Ignore UEFI
|
|
LoadOptions that are just NUL characters."), a check was added to
|
|
discard load options that are entirely NUL. We now see some firmwares
|
|
that start LoadOptions with a NUL, and then follow it with garbage (path
|
|
to directory containing loaders). Widen the check to just discard
|
|
anything that starts with a NUL.
|
|
|
|
Resolves: #490
|
|
Related: #95
|
|
See-also: https://bugzilla.redhat.com/show_bug.cgi?id=2113005
|
|
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
|
|
---
|
|
include/ucs2.h | 18 ------------------
|
|
load-options.c | 7 ++++++-
|
|
2 files changed, 6 insertions(+), 19 deletions(-)
|
|
|
|
diff --git a/include/ucs2.h b/include/ucs2.h
|
|
index ee038ce..87eab32 100644
|
|
--- a/include/ucs2.h
|
|
+++ b/include/ucs2.h
|
|
@@ -63,22 +63,4 @@ StrCSpn(const CHAR16 *s, const CHAR16 *reject)
|
|
return ret;
|
|
}
|
|
|
|
-/*
|
|
- * Test if an entire buffer is nothing but NUL characters. This
|
|
- * implementation "gracefully" ignores the difference between the
|
|
- * UTF-8/ASCII 1-byte NUL and the UCS-2 2-byte NUL.
|
|
- */
|
|
-static inline bool
|
|
-__attribute__((__unused__))
|
|
-is_all_nuls(UINT8 *data, UINTN data_size)
|
|
-{
|
|
- UINTN i;
|
|
-
|
|
- for (i = 0; i < data_size; i++) {
|
|
- if (data[i] != 0)
|
|
- return false;
|
|
- }
|
|
- return true;
|
|
-}
|
|
-
|
|
#endif /* SHIM_UCS2_H */
|
|
diff --git a/load-options.c b/load-options.c
|
|
index c6bb742..a8c6e1a 100644
|
|
--- a/load-options.c
|
|
+++ b/load-options.c
|
|
@@ -404,8 +404,13 @@ parse_load_options(EFI_LOADED_IMAGE *li)
|
|
|
|
/*
|
|
* Apparently sometimes we get L"\0\0"? Which isn't useful at all.
|
|
+ *
|
|
+ * Possibly related, but some boards have additional data before the
|
|
+ * size which is garbage (it's a weird path to the directory
|
|
+ * containing the loaders). Known boards that do this: Kontron VX3040
|
|
+ * (AMI), ASUS B85M-E, and at least one "older Dell laptop".
|
|
*/
|
|
- if (is_all_nuls(li->LoadOptions, li->LoadOptionsSize))
|
|
+ if (((CHAR16 *)li->LoadOptions)[0] == 0)
|
|
return EFI_SUCCESS;
|
|
|
|
/*
|
|
--
|
|
2.27.0
|
|
|