diff options
| author | Peter Jones <pjones@redhat.com> | 2018-03-06 15:16:51 -0500 |
|---|---|---|
| committer | Peter Jones <pjones@redhat.com> | 2018-03-06 15:28:00 -0500 |
| commit | 6c8d08c0af4768c715b79c8ec25141d56e34f8b4 (patch) | |
| tree | cd7a574d3fc0f5fb68afed807ca168b572d38763 | |
| parent | e2073885773e45d112aca457cbd730dc0551b9ee (diff) | |
| download | efi-boot-shim-6c8d08c0af4768c715b79c8ec25141d56e34f8b4.tar.gz efi-boot-shim-6c8d08c0af4768c715b79c8ec25141d56e34f8b4.zip | |
shim: Ignore UEFI LoadOptions that are just NUL characters.
I don't know when or why we ever see this, but it's easy enough to
avoid.
Resolves github issue #95
Signed-off-by: Peter Jones <pjones@redhat.com>
| -rw-r--r-- | shim.c | 6 | ||||
| -rw-r--r-- | ucs2.h | 20 |
2 files changed, 26 insertions, 0 deletions
@@ -2583,6 +2583,12 @@ EFI_STATUS set_second_stage (EFI_HANDLE image_handle) } /* + * Apparently sometimes we get L"\0\0"? Which isn't useful at all. + */ + if (is_all_nuls(li->LoadOptions, li->LoadOptionsSize)) + return EFI_SUCCESS; + + /* * Check and see if this is just a list of strings. If it's an * EFI_LOAD_OPTION, it'll be 0, since we know EndEntire device path * won't pass muster as UCS2-LE. @@ -36,6 +36,8 @@ #ifndef SHIM_UCS2_H #define SHIM_UCS2_H +#include <stdbool.h> + static inline INTN __attribute__((unused)) StrCaseCmp(CHAR16 *s0, CHAR16 *s1) @@ -89,6 +91,24 @@ 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; +} + static inline UINTN __attribute__((__unused__)) count_ucs2_strings(UINT8 *data, UINTN data_size) |
