>
>
>
> 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
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to