mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-18 02:44:37 +00:00
efi_loader: support file rename in SetInfo()
Following the UEFI specification. The specification did not seem to delineate if file_name was explicitly a file name only, or could include paths to move the file to a different directory. The more generous interpretation of supporting paths was selected. Signed-off-by: Gabriel Dalimonte <gabriel.dalimonte@gmail.com> Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
parent
8465ee528b
commit
0165e1a8bd
1 changed files with 39 additions and 6 deletions
|
@ -954,6 +954,7 @@ static efi_status_t EFIAPI efi_file_setinfo(struct efi_file_handle *file,
|
|||
{
|
||||
struct file_handle *fh = to_fh(file);
|
||||
efi_status_t ret = EFI_UNSUPPORTED;
|
||||
char *new_file_name = NULL, *new_path = NULL;
|
||||
|
||||
EFI_ENTRY("%p, %pUs, %zu, %p", file, info_type, buffer_size, buffer);
|
||||
|
||||
|
@ -983,13 +984,43 @@ static efi_status_t EFIAPI efi_file_setinfo(struct efi_file_handle *file,
|
|||
pos = new_file_name;
|
||||
utf16_utf8_strcpy(&pos, info->file_name);
|
||||
if (strcmp(new_file_name, filename)) {
|
||||
/* TODO: we do not support renaming */
|
||||
EFI_PRINT("Renaming not supported\n");
|
||||
free(new_file_name);
|
||||
ret = EFI_ACCESS_DENIED;
|
||||
goto out;
|
||||
int dlen;
|
||||
int rv;
|
||||
|
||||
if (set_blk_dev(fh)) {
|
||||
ret = EFI_DEVICE_ERROR;
|
||||
goto out;
|
||||
}
|
||||
dlen = filename - fh->path;
|
||||
new_path = calloc(1, dlen + strlen(new_file_name) + 1);
|
||||
if (!new_path) {
|
||||
ret = EFI_OUT_OF_RESOURCES;
|
||||
goto out;
|
||||
}
|
||||
memcpy(new_path, fh->path, dlen);
|
||||
strcpy(new_path + dlen, new_file_name);
|
||||
sanitize_path(new_path);
|
||||
rv = fs_exists(new_path);
|
||||
if (rv) {
|
||||
ret = EFI_ACCESS_DENIED;
|
||||
goto out;
|
||||
}
|
||||
/* fs_exists() calls fs_close(), so open file system again */
|
||||
if (set_blk_dev(fh)) {
|
||||
ret = EFI_DEVICE_ERROR;
|
||||
goto out;
|
||||
}
|
||||
rv = fs_rename(fh->path, new_path);
|
||||
if (rv) {
|
||||
ret = EFI_ACCESS_DENIED;
|
||||
goto out;
|
||||
}
|
||||
free(fh->path);
|
||||
fh->path = new_path;
|
||||
/* Prevent new_path from being freed on out */
|
||||
new_path = NULL;
|
||||
ret = EFI_SUCCESS;
|
||||
}
|
||||
free(new_file_name);
|
||||
/* Check for truncation */
|
||||
if (!fh->isdir) {
|
||||
ret = efi_get_file_size(fh, &file_size);
|
||||
|
@ -1012,6 +1043,8 @@ static efi_status_t EFIAPI efi_file_setinfo(struct efi_file_handle *file,
|
|||
ret = EFI_UNSUPPORTED;
|
||||
}
|
||||
out:
|
||||
free(new_path);
|
||||
free(new_file_name);
|
||||
return EFI_EXIT(ret);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue