>
>
>
> Changes in v3:
> - Command arguments, maybe this command is better if it doesn't have
> any command argument, since we are printing only. Command options is
> just unneccessary. And this is how many grub commands does, so it
> should align.
>
Options are good. Just use extcmd to parse them, not manual parsing.
+static void
>
Better to return grub_err_t here and properly propagate it
> +dump_variable_data(const char *variable_name, grub_guid_t *variable_guid)
> +{
> + grub_efi_status_t status;
> + grub_efi_uint32_t attributes;
> + grub_size_t data_size;
> + void *data;
> +
> + status = grub_efi_get_variable_with_attributes(variable_name,
> variable_guid,
> + &data_size, &data,
> &attributes);
> + if (status != GRUB_EFI_SUCCESS)
> + {
> + grub_error(GRUB_ERR_IO, "failed to retrieve variable data 0x%"
> PRIxGRUB_EFI_UINTN_T, status);
> + return;
> + }
> +
> + grub_printf(_("Attributes:\n"));
> + if (attributes & GRUB_EFI_VARIABLE_NON_VOLATILE)
> + grub_printf(_("\tNon-Volatile\n"));
> + if (attributes & GRUB_EFI_VARIABLE_BOOTSERVICE_ACCESS)
> + grub_printf(_("\tBoot Service Access\n"));
> + if (attributes & GRUB_EFI_VARIABLE_RUNTIME_ACCESS)
> + grub_printf(_("\tRuntime Service Access\n"));
> +
> + grub_printf(_("Value:\n"));
> + hexdump(0, data, data_size);
> + grub_free(data);
> +}
> +
> +static grub_err_t
> +dump_efi_variables(void)
> +{
> + grub_efi_status_t status;
> + grub_efi_runtime_services_t *r;
> + grub_efi_uintn_t variable_name_size = 512;
> + grub_efi_char16_t *variable_name;
> + grub_uint8_t *variable_name_string = NULL;
> + grub_guid_t vendor_guid;
> +
> + r = grub_efi_system_table->runtime_services;
> +
> + variable_name = grub_calloc(variable_name_size,
> sizeof(grub_efi_char16_t));
> + if (variable_name == NULL)
> + return grub_errno;
> + *variable_name = 0; /* Start with empty string */
> +
> + while (1)
> + {
> + status = r->get_next_variable_name(&variable_name_size,
> variable_name, &vendor_guid);
> + if (status == GRUB_EFI_NOT_FOUND)
> + break;
> + else if (status == GRUB_EFI_BUFFER_TOO_SMALL)
> + {
> + grub_dprintf("lsefivar", "buffer isn't enough,
> enlarging up to %ld bytes\n",variable_name_size *
> sizeof(grub_efi_char16_t));
> + variable_name = grub_realloc(variable_name,
> variable_name_size * sizeof(grub_efi_char16_t));
> + if (variable_name == NULL)
> + {
> + grub_free(variable_name);
>
This free of NULL does absolutely nothing. Please fix it.
> + return grub_errno;
> + }
> + }
> + variable_name_string = grub_calloc(variable_name_size,
> GRUB_MAX_UTF8_PER_UTF16);
>
This is not enough. You need 1 byte more.
> + if (variable_name_string == NULL)
> + {
> + grub_free(variable_name);
> + return grub_errno;
> + }
> + *grub_utf16_to_utf8(variable_name_string, variable_name,
> variable_name_size) = '\0';
> + grub_printf("%pG-%s\n",&vendor_guid, variable_name_string);
> + dump_variable_data((char*)variable_name_string,
> &vendor_guid);
> + }
> +
> + grub_free(variable_name);
> + if (variable_name_string)
> + grub_free(variable_name_string);
>
grub_free already checks for null.
+ return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +grub_cmd_lsefivar (grub_command_t cmd __attribute__((unused)),
> + int argc __attribute__((unused)), char **argv
> __attribute__((unused)))
> +{
> + return dump_efi_variables();
>
As I said: options and extcmd. Like normal ls command
> +}
> +
> +static grub_command_t cmd;
> +
> +GRUB_MOD_INIT(lsefivar)
> +{
> + cmd = grub_register_command("lsefivar", grub_cmd_lsefivar, NULL,
> N_("Display UEFI variables."));
> +}
> +GRUB_MOD_FINI(lsefivar)
> +{
> + grub_unregister_command(cmd);
> +}
> +
> +
> --
> 2.49.0
>
>
> _______________________________________________
> Grub-devel mailing list
> [email protected]
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel