Hi Gabriel

On Wed, 22 Jan 2025 at 07:34, Gabriel Dalimonte
<gabriel.dalimo...@gmail.com> wrote:
>
> 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.dalimo...@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;

It's not too clear from the patch context but, instead of keeping
track of new_file_name/new_path can you move it to 'out' and init
those variables to NULL?

> +                       }
> +                       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);

I think we should add some kind of an error message here and in the fails below.

Otherwise looks good.
Thanks
/Ilias

> +                               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
>

Reply via email to