
28 Dec
2020
28 Dec
'20
11:06 p.m.
Hi Heinrich,
- /* make sure we have enough space for replacements */
- if (u16_strsize(name) < sizeof(*name) * start + u16_strsize(L"####")) {
ret = EFI_INVALID_PARAMETER;
goto out;
- }
- boot_order_size = sizeof(boot_order);
- ret = efi_get_variable_int(L"BootCurrent",
&efi_global_variable_guid, NULL,
&boot_order_size, &boot_order, NULL);
- if (ret != EFI_SUCCESS)
goto out;
- name_dup = u16_strdup(name);
- if (!name_dup) {
ret = EFI_OUT_OF_RESOURCES;
goto out;
- }
- /* Match name variable to BootCurrent */
- name_dup[start] = hexmap[(boot_order & 0xf000) >> 12];
- name_dup[start + 1] = hexmap[(boot_order & 0x0f00) >> 8];
- name_dup[start + 2] = hexmap[(boot_order & 0x00f0) >> 4];
- name_dup[start + 3] = hexmap[(boot_order & 0x000f) >> 0];
Please, consider using efi_create_indexed_name().
That one doesn't check any input variables and just asks for the user to provide sufficient buffers for the output. I am explicitly checking the sizes here. I guess I can add similar checks to efi_create_indexed_name() and use it, instead of open coding again. Just a note here, there's similar code to the efi bootmgr, so we should probably start replacing all of the functions.
Regards /Ilias
Best regards
Heinrich
- var_value = get_var(name_dup, &efi_global_variable_guid, &size);
- if (!var_value) {
ret = EFI_NOT_FOUND;
goto out;
- }
- ret = string_to_load_args(var_value, info);
- if (ret != EFI_SUCCESS)
goto out;
- if (fs_set_blk_dev(info->dev, info->part, FS_TYPE_ANY)) {
ret = EFI_NO_MEDIA;
goto out;
- }
- if (!fs_exists(info->filename)) {
ret = EFI_NOT_FOUND;
goto out;
- }
+out:
- free(var_value);
- free(name_dup);
- return ret;
+}