summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Drake <drake@endlessm.com>2017-02-21 10:55:43 -0600
committerGitHub <noreply@github.com>2017-02-21 10:55:43 -0600
commitd63a91ba0e50e1e9054e200f8a3e262b668a7ad3 (patch)
tree0de861d9dea84adf6c4596101f1755fbeca13678
parent692218f58d37b415bc7e92dd82c2b8211b84795f (diff)
parentb45652aba2d797b64516ba2867d756c39a6735d1 (diff)
downloadefi-boot-shim-Release_3.1.5.tar.gz
efi-boot-shim-Release_3.1.5.zip
Merge pull request #9 from endlessm/T15481Release_3.1.5Release_3.1.4Release_3.1.3
fallback: Consider all Boot* vars when checking for duplicates
-rw-r--r--fallback.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/fallback.c b/fallback.c
index 22629340..174fd8cb 100644
--- a/fallback.c
+++ b/fallback.c
@@ -246,21 +246,39 @@ add_new_boot_option(EFI_DEVICE_PATH *hddp, EFI_DEVICE_PATH *fulldp,
}
int
+isxdigit(CHAR16 c)
+{
+ return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') ||
+ (c >= 'a' && c <= 'f'));
+}
+
+int
find_boot_option(EFI_DEVICE_PATH *dp, EFI_DEVICE_PATH *fulldp,
CHAR16 *filename, CHAR16 *label, CHAR16 *arguments)
{
- int i = 0;
- CHAR16 varname[] = L"Boot0000";
- CHAR16 hexmap[] = L"0123456789ABCDEF";
- EFI_GUID global = EFI_GLOBAL_VARIABLE;
+ EFI_STATUS status;
+ EFI_GUID global;
+ int ret = -1;
- for(i = 0; i < nbootorder && i < 0x10000; i++) {
- varname[4] = hexmap[(bootorder[i] & 0xf000) >> 12];
- varname[5] = hexmap[(bootorder[i] & 0x0f00) >> 8];
- varname[6] = hexmap[(bootorder[i] & 0x00f0) >> 4];
- varname[7] = hexmap[(bootorder[i] & 0x000f) >> 0];
+ UINTN CANDIDATE_SIZE = 256;
+ CHAR16 *varname = AllocateZeroPool(CANDIDATE_SIZE * sizeof(CHAR16));
+ if (!varname) {
+ Print(L"Could not allocate memory\n");
+ return ret;
+ }
+
+ while (1) {
+ UINTN candidate_size = CANDIDATE_SIZE;
+ status = uefi_call_wrapper(RT->GetNextVariableName, 3,
+ &candidate_size, varname, &global);
+ if (status != EFI_SUCCESS)
+ break;
+
+ if (StrLen(varname) != 8 || StrnCmp(varname, L"Boot", 4) ||
+ !isxdigit(varname[4]) || !isxdigit(varname[5]) ||
+ !isxdigit(varname[6]) || !isxdigit(varname[7]))
+ continue;
- UINTN candidate_size;
CHAR8 *candidate = LibGetVariableAndSize(varname, &global,
&candidate_size);
if (!candidate)
@@ -280,9 +298,11 @@ find_boot_option(EFI_DEVICE_PATH *dp, EFI_DEVICE_PATH *fulldp,
/* at this point, we have duplicate data. */
FreePool(candidate);
- return i;
+ ret = xtoi(varname + 4);
+ break;
}
- return -1;
+ FreePool(varname);
+ return ret;
}
EFI_STATUS