Le lun. 12 mai 2025, 10:37, khaalid cali <khaliidca...@gmail.com> a écrit :

> From: khaalid <khaliidc...@gmail.com>
>
> > Vladimir 'phcoder' Serbinenko wrote:
> > Please have a look at how to handle errors with realloc. You need to
> keep a copy of old pointer in case you have to free it. Some places in our
> codebase have similar memory leaks but it'> s not a reason to introduce
> more.
>
> Well, i followed style used on codebase mostly. And now fine.
>
> Signed-off-by: Khalid Ali <khaliidca...@gmail.com>
> ---
>  grub-core/Makefile.core.def       |   6 ++
>  grub-core/commands/efi/lsefivar.c | 139 ++++++++++++++++++++++++++++++
>  2 files changed, 145 insertions(+)
>  create mode 100644 grub-core/commands/efi/lsefivar.c
>
> diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
> index f70e02e69..8b9cf2a68 100644
> --- a/grub-core/Makefile.core.def
> +++ b/grub-core/Makefile.core.def
> @@ -840,6 +840,12 @@ module = {
>    enable = efi;
>  };
>
> +module = {
> +  name = lsefivar;
> +  efi = commands/efi/lsefivar.c;
> +  enable = efi;
> +};
> +
>  module = {
>    name = blocklist;
>    common = commands/blocklist.c;
> diff --git a/grub-core/commands/efi/lsefivar.c
> b/grub-core/commands/efi/lsefivar.c
> new file mode 100644
> index 000000000..d18ca296b
> --- /dev/null
> +++ b/grub-core/commands/efi/lsefivar.c
> @@ -0,0 +1,139 @@
> +/* efivar.c - dump runtime uefi variables. */
> +/*
> + *  GRUB  --  GRand Unified Bootloader
> + *  Copyright (C) 2025  Free Software Foundation, Inc.
> + *
> + *  GRUB is free software: you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation, either version 3 of the License, or
> + *  (at your option) any later version.
> + *
> + *  GRUB is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +
> +
> +#include <grub/dl.h>
> +#include <grub/misc.h>
> +#include <grub/charset.h>
> +#include <grub/extcmd.h>
> +#include <grub/efi/efi.h>
> +#include <grub/efi/api.h>
> +#include <grub/lib/hexdump.h>
> +
> +GRUB_MOD_LICENSE ("GPLv3+");
> +
> +static const struct grub_arg_option options[] =
> +{
> +       {0, 'l', 0, N_("Dump variable contents"), 0, 0},
> +       {0, 0, 0, 0, 0, 0}
> +};
> +
> +static void
> +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);
> +        grub_errno = GRUB_ERR_NONE;
>
Do not call grub_error here.

> +        return;
> +    }
> +
> +    grub_puts_("Attributes:\n");
>
Puts_(N_(...))
Having to put N_ is unfortunate and I might fix it separately but for now,
is necessary.

> +    if (attributes & GRUB_EFI_VARIABLE_NON_VOLATILE)
> +        grub_printf(_("\tNon-Volatile\n"));
>
puts_

> +    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_efi_char16_t *tmp;
> +                       grub_dprintf("lsefivar", "buffer isn't enough,
> enlarging up to %ld bytes\n",variable_name_size *
> sizeof(grub_efi_char16_t));
> +                       tmp = grub_realloc(variable_name,
> variable_name_size * sizeof(grub_efi_char16_t));
> +                       if (tmp == NULL)
> +                       {
> +                               grub_free (variable_name);
> +                               return grub_errno;
> +                       }
> +                       variable_name = tmp;
> +               }
> +               variable_name_string = grub_calloc(variable_name_size + 1,
> GRUB_MAX_UTF8_PER_UTF16);
> +               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);
> +       grub_free(variable_name_string);
> +       return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +grub_cmd_lsefivar (grub_extcmd_context_t ctxt,
> +                int argc __attribute__((unused)), char **argv
> __attribute__((unused)))
> +{
> +       if (ctxt->state[0].set)
> +               return dump_efi_variables();
>

Without -l it should print just the list of variables without their
contents, not throw an error

+
> +       return grub_error (GRUB_ERR_BAD_ARGUMENT, "one argument expected");
> +}
> +
> +static grub_extcmd_t cmd;
> +
> +GRUB_MOD_INIT(lsefivar)
> +{
> +       cmd = grub_register_extcmd ("lsefivar", grub_cmd_lsefivar, 0,
> N_("[-l]"), N_("Display UEFI variables."), options);
> +}
> +GRUB_MOD_FINI(lsefivar)
> +{
> +       grub_unregister_extcmd (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