[PATCH v10 02/11] efi_loader: capsule: add capsule_on_disk support
Heinrich Schuchardt
xypron.glpk at gmx.de
Wed Mar 17 22:02:54 CET 2021
On 11/30/20 10:12 AM, AKASHI Takahiro wrote:
> Capsule data can be loaded into the system either via UpdateCapsule
> runtime service or files on a file system (of boot device).
> The latter case is called "capsules on disk", and actual updates will
> take place at the next boot time.
>
> In this commit, we will support capsule on disk mechanism.
>
> Please note that U-Boot itself has no notion of "boot device" and
> all the capsule files to be executed will be detected only if they
> are located in a specific directory, \EFI\UpdateCapsule, on a device
> that is identified as a boot device by "BootXXXX" variables.
>
> Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>
> ---
<snip />
> +static efi_status_t efi_capsule_scan_dir(u16 ***files, unsigned int *num)
> +{
> + struct efi_file_handle *dirh;
> + struct efi_file_info *dirent;
> + efi_uintn_t dirent_size, tmp_size;
> + unsigned int count;
> + u16 **tmp_files;
> + efi_status_t ret;
> +
> + ret = find_boot_device();
> + if (ret == EFI_NOT_FOUND) {
> + EFI_PRINT("EFI Capsule: bootdev is not set\n");
> + *num = 0;
> + return EFI_SUCCESS;
> + } else if (ret != EFI_SUCCESS) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + /* count capsule files */
> + ret = EFI_CALL((*bootdev_root->open)(bootdev_root, &dirh,
> + EFI_CAPSULE_DIR,
> + EFI_FILE_MODE_READ, 0));
> + if (ret != EFI_SUCCESS) {
> + *num = 0;
> + return EFI_SUCCESS;
> + }
> +
> + dirent_size = 256;
> + dirent = malloc(dirent_size);
> + if (!dirent)
> + return EFI_OUT_OF_RESOURCES;
> +
> + count = 0;
> + while (1) {
> + tmp_size = dirent_size;
> + ret = EFI_CALL((*dirh->read)(dirh, &tmp_size, dirent));
> + if (ret == EFI_BUFFER_TOO_SMALL) {
> + dirent = realloc(dirent, tmp_size);
> + if (!dirent) {
If realloc() fails, you should free the *old* pointer.
Best regards
Heinrich
> + ret = EFI_OUT_OF_RESOURCES;
> + goto err;
> + }
More information about the U-Boot
mailing list