From cff7700170c2eb9d8059acbc2a5664ee9c8a8a9b Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sun, 30 Jul 2023 14:03:53 +0200 Subject: [PATCH] efi_loader: error handling in efi_disk_add_dev * If an error occurs in efi_disk_add_dev(), don't leak resources. * If calloc() fails while creating the file system protocol interface, signal an error. * Rename efi_simple_file_system() to efi_create_simple_file_system(). * Drop a little helpful debug message. Fixes: 2a92080d8c44 ("efi_loader: add file/filesys support") Signed-off-by: Heinrich Schuchardt Reviewed-by: Ilias Apalodimas --- include/efi_loader.h | 18 +++++++++++++++--- lib/efi_loader/efi_disk.c | 15 +++++++++------ lib/efi_loader/efi_file.c | 12 ++++++++---- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/include/efi_loader.h b/include/efi_loader.h index 3a64eb9c66..4a29ddaef4 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -696,9 +696,21 @@ void efi_signal_event(struct efi_event *event); /* return true if the device is removable */ bool efi_disk_is_removable(efi_handle_t handle); -/* open file system: */ -struct efi_simple_file_system_protocol *efi_simple_file_system( - struct blk_desc *desc, int part, struct efi_device_path *dp); +/** + * efi_create_simple_file_system() - create simple file system protocol + * + * Create a simple file system protocol for a partition. + * + * @desc: block device descriptor + * @part: partition number + * @dp: device path + * @fsp: simple file system protocol + * Return: status code + */ +efi_status_t +efi_create_simple_file_system(struct blk_desc *desc, int part, + struct efi_device_path *dp, + struct efi_simple_file_system_protocol **fsp); /* open file from device-path: */ struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp); diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c index 46cb5704a7..f0d76113b0 100644 --- a/lib/efi_loader/efi_disk.c +++ b/lib/efi_loader/efi_disk.c @@ -487,15 +487,16 @@ static efi_status_t efi_disk_add_dev( */ if ((part || desc->part_type == PART_TYPE_UNKNOWN) && efi_fs_exists(desc, part)) { - diskobj->volume = efi_simple_file_system(desc, part, - diskobj->dp); + ret = efi_create_simple_file_system(desc, part, diskobj->dp, + &diskobj->volume); + if (ret != EFI_SUCCESS) + goto error; + ret = efi_add_protocol(&diskobj->header, &efi_simple_file_system_protocol_guid, diskobj->volume); - if (ret != EFI_SUCCESS) { - log_debug("simple FS failed\n"); - return ret; - } + if (ret != EFI_SUCCESS) + goto error; } diskobj->ops = block_io_disk_template; diskobj->dev_index = dev_index; @@ -538,6 +539,8 @@ static efi_status_t efi_disk_add_dev( return EFI_SUCCESS; error: efi_delete_handle(&diskobj->header); + free(diskobj->volume); + free(diskobj); return ret; } diff --git a/lib/efi_loader/efi_file.c b/lib/efi_loader/efi_file.c index 520c730220..3764a92b50 100644 --- a/lib/efi_loader/efi_file.c +++ b/lib/efi_loader/efi_file.c @@ -1192,18 +1192,22 @@ efi_open_volume(struct efi_simple_file_system_protocol *this, return EFI_EXIT(efi_open_volume_int(this, root)); } -struct efi_simple_file_system_protocol * -efi_simple_file_system(struct blk_desc *desc, int part, - struct efi_device_path *dp) +efi_status_t +efi_create_simple_file_system(struct blk_desc *desc, int part, + struct efi_device_path *dp, + struct efi_simple_file_system_protocol **fsp) { struct file_system *fs; fs = calloc(1, sizeof(*fs)); + if (!fs) + return EFI_OUT_OF_RESOURCES; fs->base.rev = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION; fs->base.open_volume = efi_open_volume; fs->desc = desc; fs->part = part; fs->dp = dp; + *fsp = &fs->base; - return &fs->base; + return EFI_SUCCESS; } -- 2.39.5