mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-18 21:21:37 +00:00
efi_loader: enable file SetInfo()
EFI shell command edit uses the SetInfo() methods to unset the read only attribute of the file to be edited. So let efi_file_setinfo() return success in this case. Return an error if the function is called for to rename or resize a file as we do not support this yet. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
parent
cb0c2a7430
commit
fbe4c7df00
1 changed files with 65 additions and 2 deletions
|
@ -637,9 +637,72 @@ static efi_status_t EFIAPI efi_file_setinfo(struct efi_file_handle *file,
|
||||||
efi_uintn_t buffer_size,
|
efi_uintn_t buffer_size,
|
||||||
void *buffer)
|
void *buffer)
|
||||||
{
|
{
|
||||||
EFI_ENTRY("%p, %p, %zu, %p", file, info_type, buffer_size, buffer);
|
struct file_handle *fh = to_fh(file);
|
||||||
|
efi_status_t ret = EFI_UNSUPPORTED;
|
||||||
|
|
||||||
return EFI_EXIT(EFI_UNSUPPORTED);
|
EFI_ENTRY("%p, %pUl, %zu, %p", file, info_type, buffer_size, buffer);
|
||||||
|
|
||||||
|
if (!guidcmp(info_type, &efi_file_info_guid)) {
|
||||||
|
struct efi_file_info *info = (struct efi_file_info *)buffer;
|
||||||
|
char *filename = basename(fh);
|
||||||
|
char *new_file_name, *pos;
|
||||||
|
loff_t file_size;
|
||||||
|
|
||||||
|
if (buffer_size < sizeof(struct efi_file_info)) {
|
||||||
|
ret = EFI_BAD_BUFFER_SIZE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
/* We cannot change the directory attribute */
|
||||||
|
if (!fh->isdir != !(info->attribute & EFI_FILE_DIRECTORY)) {
|
||||||
|
ret = EFI_ACCESS_DENIED;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
/* Check for renaming */
|
||||||
|
new_file_name = malloc(utf16_utf8_strlen(info->file_name));
|
||||||
|
if (!new_file_name) {
|
||||||
|
ret = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
free(new_file_name);
|
||||||
|
/* Check for truncation */
|
||||||
|
if (set_blk_dev(fh)) {
|
||||||
|
ret = EFI_DEVICE_ERROR;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (fs_size(fh->path, &file_size)) {
|
||||||
|
ret = EFI_DEVICE_ERROR;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (file_size != info->file_size) {
|
||||||
|
/* TODO: we do not support truncation */
|
||||||
|
EFI_PRINT("Truncation not supported\n");
|
||||||
|
ret = EFI_ACCESS_DENIED;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* We do not care for the other attributes
|
||||||
|
* TODO: Support read only
|
||||||
|
*/
|
||||||
|
ret = EFI_SUCCESS;
|
||||||
|
} else if (!guidcmp(info_type, &efi_file_system_info_guid)) {
|
||||||
|
if (buffer_size < sizeof(struct efi_file_system_info)) {
|
||||||
|
ret = EFI_BAD_BUFFER_SIZE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ret = EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
return EFI_EXIT(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static efi_status_t EFIAPI efi_file_flush(struct efi_file_handle *file)
|
static efi_status_t EFIAPI efi_file_flush(struct efi_file_handle *file)
|
||||||
|
|
Loading…
Add table
Reference in a new issue