
Hi Kojima-san, On Thu, Mar 24, 2022 at 10:54:41PM +0900, Masahisa Kojima wrote:
I haven't been able to get the patch working yet. I'll send more feedback once I do. Here's a few comments I have
[...]
+struct efi_bootmenu_file_entry_data {
- struct efi_bootmenu_boot_option *bo;
- struct efi_file_info *f;
+};
+static efi_status_t efi_bootmenu_process_boot_selected(void *data, bool *exit); +static efi_status_t efi_bootmenu_process_add_boot_option(void *data, bool *exit); +static efi_status_t efi_bootmenu_process_delete_boot_option(void *data, bool *exit); +static efi_status_t efi_bootmenu_process_change_boot_order(void *data, bool *exit);
I think you can re-arrange some of the functions and get rid of the forward declarations
+static struct efi_bootmenu_item maintenance_menu_items[] = {
const ?
- {u"Add Boot Option", efi_bootmenu_process_add_boot_option},
- {u"Delete Boot Option", efi_bootmenu_process_delete_boot_option},
- {u"Change Boot Order", efi_bootmenu_process_change_boot_order},
- {u"Quit", NULL},
+};
+static void efi_bootmenu_print_entry(void *data) +{
- struct efi_bootmenu_entry *entry = data;
[...]
new_len = u16_strlen(info->bo->current_path) +
/* TODO: show error notification to user */
log_err("file path is too long\n");
return EFI_INVALID_PARAMETER;
Can we just check for new_len + 1 here and get rid of the follow up check ?
}
u16_strlcat(info->bo->current_path, info->f->file_name, EFI_BOOTMENU_FILE_PATH_MAX);
if (info->f->attribute & EFI_FILE_DIRECTORY) {
if (new_len + 1 >= EFI_BOOTMENU_FILE_PATH_MAX) {
log_err("file path is too long\n");
return EFI_INVALID_PARAMETER;
}
u16_strlcat(info->bo->current_path, u"\\", EFI_BOOTMENU_FILE_PATH_MAX);
} else {
info->bo->file_selected = true;
}
[...]
menu_item = calloc(count + 1, sizeof(struct efi_bootmenu_item));
if (!menu_item) {
efi_file_close_int(f);
free(dir_buf);
ret = EFI_OUT_OF_RESOURCES;
goto out;
}
/* read directory and construct menu structure */
efi_file_setpos_int(f, 0);
iter = menu_item;
ptr = (struct efi_file_info *)dir_buf;
This will cause an unaligned access later on when you access ptr->attribute. Any reason we can't allocate ptr directly?
for (i = 0; i < count; i++) {
int name_len;
u16 *name;
struct efi_bootmenu_file_entry_data *info;
len = size;
ret = efi_file_read_int(f, &len, ptr);
if (ret != EFI_SUCCESS || len == 0)
goto err;
if (ptr->attribute & EFI_FILE_DIRECTORY) {
/* append u'/' at the end of directory name */
name_len = u16_strsize(ptr->file_name) + sizeof(u16);
name = calloc(1, name_len);
if (!name) {
ret = EFI_OUT_OF_RESOURCES;
goto err;
}
u16_strcpy(name, ptr->file_name);
name[u16_strlen(ptr->file_name)] = u'/';
} else {
name_len = u16_strsize(ptr->file_name);
name = calloc(1, name_len);
if (!name) {
ret = EFI_OUT_OF_RESOURCES;
goto err;
}
u16_strcpy(name, ptr->file_name);
}
info = calloc(1, sizeof(struct efi_bootmenu_file_entry_data));
if (!info) {
ret = EFI_OUT_OF_RESOURCES;
goto err;
}
info->f = ptr;
info->bo = bo;
iter->title = name;
iter->func = efi_bootmenu_file_selected;
iter->data = info;
iter++;
size -= len;
ptr = (struct efi_file_info *)((char *)ptr + len);
ditto
}
/* add "Quit" entry */
iter->title = u"Quit";
iter->func = NULL;
iter->data = NULL;
count += 1;
ret = efi_bootmenu_process_common(menu_item, count, -1);
+err:
efi_file_close_int(f);
iter = menu_item;
for (i = 0; i < count - 1; i++, iter++) {
free(iter->title);
free(iter->data);
}
free(dir_buf);
free(menu_item);
if (ret != EFI_SUCCESS)
break;
- }
+out:
- free(buf);
- return ret;
+}
[...]
Regards /Ilias