efi_loader: efi_setup_loaded_image() handle missing file name

This is a preparatory patch.

efi_dp_split_file_path() is used to create device_path and file_path
from file_path for efi_setup_loaded_image().
In a special case, however, of HARDWARE_DEVICE/MEMORY, it doesn't
work expectedly since this path doesn't contain any FILE_PATH sub-type.

This patch makes a workaround.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>

Adjust the logic such that for all paths that do no end on a media file
path we return NULL as file_path.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
AKASHI Takahiro 2019-04-16 17:39:26 +02:00 committed by Heinrich Schuchardt
parent 6c5f8dd540
commit f86076d885

View file

@ -917,14 +917,14 @@ struct efi_device_path *efi_dp_from_mem(uint32_t memory_type,
* *
* @full_path: device path including device and file path * @full_path: device path including device and file path
* @device_path: path of the device * @device_path: path of the device
* @file_path: relative path of the file * @file_path: relative path of the file or NULL if there is none
* Return: status code * Return: status code
*/ */
efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path, efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
struct efi_device_path **device_path, struct efi_device_path **device_path,
struct efi_device_path **file_path) struct efi_device_path **file_path)
{ {
struct efi_device_path *p, *dp, *fp; struct efi_device_path *p, *dp, *fp = NULL;
*device_path = NULL; *device_path = NULL;
*file_path = NULL; *file_path = NULL;
@ -935,7 +935,7 @@ efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
while (!EFI_DP_TYPE(p, MEDIA_DEVICE, FILE_PATH)) { while (!EFI_DP_TYPE(p, MEDIA_DEVICE, FILE_PATH)) {
p = efi_dp_next(p); p = efi_dp_next(p);
if (!p) if (!p)
return EFI_INVALID_PARAMETER; goto out;
} }
fp = efi_dp_dup(p); fp = efi_dp_dup(p);
if (!fp) if (!fp)
@ -944,6 +944,7 @@ efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
p->sub_type = DEVICE_PATH_SUB_TYPE_END; p->sub_type = DEVICE_PATH_SUB_TYPE_END;
p->length = sizeof(*p); p->length = sizeof(*p);
out:
*device_path = dp; *device_path = dp;
*file_path = fp; *file_path = fp;
return EFI_SUCCESS; return EFI_SUCCESS;