[PATCH 6/6] efi_loader: support file rename in SetInfo()
Gabriel Dalimonte
gabriel.dalimonte at gmail.com
Wed Jan 22 06:32:31 CET 2025
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 at gmail.com>
---
lib/efi_loader/efi_file.c | 48 +++++++++++++++++++++++++++++++++++----
1 file changed, 43 insertions(+), 5 deletions(-)
diff --git a/lib/efi_loader/efi_file.c b/lib/efi_loader/efi_file.c
index e72bc36aca..f3d643a057 100644
--- a/lib/efi_loader/efi_file.c
+++ b/lib/efi_loader/efi_file.c
@@ -981,11 +981,49 @@ 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;
+ char *new_path;
+
+ if (set_blk_dev(fh)) {
+ free(new_file_name);
+ ret = EFI_DEVICE_ERROR;
+ goto out;
+ }
+ dlen = filename - fh->path;
+ new_path = calloc(1, dlen + strlen(new_file_name) + 1);
+ if (!new_path) {
+ free(new_file_name);
+ 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) {
+ free(new_path);
+ free(new_file_name);
+ ret = EFI_ACCESS_DENIED;
+ goto out;
+ }
+ /* fs_exists() calls fs_close(), so open file system again */
+ if (set_blk_dev(fh)) {
+ free(new_path);
+ free(new_file_name);
+ ret = EFI_DEVICE_ERROR;
+ goto out;
+ }
+ rv = fs_rename(fh->path, new_path);
+ if (rv) {
+ free(new_path);
+ free(new_file_name);
+ ret = EFI_ACCESS_DENIED;
+ goto out;
+ }
+ free(fh->path);
+ fh->path = new_path;
+ ret = EFI_SUCCESS;
}
free(new_file_name);
/* Check for truncation */
--
2.34.1
More information about the U-Boot
mailing list