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