u32 i;
u16 *bootorder;
efi_status_t ret;
- u16 *var_name16 = NULL, *p;
+ u16 *var_name16 = NULL;
efi_uintn_t num, size, buf_size;
struct efimenu *efi_menu;
struct list_head *pos, *n;
int index;
efi_guid_t guid;
- size = buf_size;
- ret = efi_get_next_variable_name_int(&size, var_name16, &guid);
+ ret = efi_next_variable_name(&buf_size, &var_name16, &guid);
if (ret == EFI_NOT_FOUND)
break;
- if (ret == EFI_BUFFER_TOO_SMALL) {
- buf_size = size;
- p = realloc(var_name16, buf_size);
- if (!p) {
- free(var_name16);
- return EFI_OUT_OF_RESOURCES;
- }
- var_name16 = p;
- ret = efi_get_next_variable_name_int(&size, var_name16, &guid);
- }
- if (ret != EFI_SUCCESS) {
- free(var_name16);
- return ret;
- }
+ if (ret != EFI_SUCCESS)
+ goto out;
+
if (efi_varname_is_load_option(var_name16, &index)) {
/* If the index is included in the BootOrder, skip it */
if (search_bootorder(bootorder, num, index, NULL))
u32 i;
char *title;
efi_status_t ret;
- u16 *var_name16 = NULL, *p;
+ u16 *var_name16 = NULL;
efi_uintn_t size, buf_size;
/* list the load option in the order of BootOrder variable */
break;
size = buf_size;
- ret = efi_get_next_variable_name_int(&size, var_name16, &guid);
+ ret = efi_next_variable_name(&buf_size, &var_name16, &guid);
if (ret == EFI_NOT_FOUND)
break;
- if (ret == EFI_BUFFER_TOO_SMALL) {
- buf_size = size;
- p = realloc(var_name16, buf_size);
- if (!p) {
- ret = EFI_OUT_OF_RESOURCES;
- goto out;
- }
- var_name16 = p;
- ret = efi_get_next_variable_name_int(&size, var_name16, &guid);
- }
if (ret != EFI_SUCCESS)
goto out;
efi_uintn_t size;
void *load_option;
struct efi_load_option lo;
- u16 *var_name16 = NULL, *p;
+ u16 *var_name16 = NULL;
u16 varname[] = u"Boot####";
efi_status_t ret = EFI_SUCCESS;
- efi_uintn_t varname_size, buf_size;
+ efi_uintn_t buf_size;
buf_size = 128;
var_name16 = malloc(buf_size);
efi_guid_t guid;
efi_uintn_t tmp;
- varname_size = buf_size;
- ret = efi_get_next_variable_name_int(&varname_size, var_name16, &guid);
+ ret = efi_next_variable_name(&buf_size, &var_name16, &guid);
if (ret == EFI_NOT_FOUND)
break;
- if (ret == EFI_BUFFER_TOO_SMALL) {
- buf_size = varname_size;
- p = realloc(var_name16, buf_size);
- if (!p) {
- free(var_name16);
- return EFI_OUT_OF_RESOURCES;
- }
- var_name16 = p;
- ret = efi_get_next_variable_name_int(&varname_size, var_name16, &guid);
- }
- if (ret != EFI_SUCCESS) {
- free(var_name16);
- return ret;
- }
+ if (ret != EFI_SUCCESS)
+ goto out;
+
if (!efi_varname_is_load_option(var_name16, &index))
continue;
}
out:
+ free(var_name16);
+
return ret;
}
return false;
}
+
+/**
+ * efi_next_variable_name() - get next variable name
+ *
+ * This function is a wrapper of efi_get_next_variable_name_int().
+ * If efi_get_next_variable_name_int() returns EFI_BUFFER_TOO_SMALL,
+ * @size and @buf are updated by new buffer size and realloced buffer.
+ *
+ * @size: pointer to the buffer size
+ * @buf: pointer to the buffer
+ * @guid: pointer to the guid
+ * Return: status code
+ */
+efi_status_t efi_next_variable_name(efi_uintn_t *size, u16 **buf, efi_guid_t *guid)
+{
+ u16 *p;
+ efi_status_t ret;
+ efi_uintn_t buf_size = *size;
+
+ ret = efi_get_next_variable_name_int(&buf_size, *buf, guid);
+ if (ret == EFI_NOT_FOUND)
+ return ret;
+ if (ret == EFI_BUFFER_TOO_SMALL) {
+ p = realloc(*buf, buf_size);
+ if (!p)
+ return EFI_OUT_OF_RESOURCES;
+
+ *buf = p;
+ *size = buf_size;
+ ret = efi_get_next_variable_name_int(&buf_size, *buf, guid);
+ }
+
+ return ret;
+}