
In order to support renaming via SetInfo(), path must allow for longer values than what was originally present when file_handle was allocated.
Signed-off-by: Gabriel Dalimonte gabriel.dalimonte@gmail.com ---
lib/efi_loader/efi_file.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/lib/efi_loader/efi_file.c b/lib/efi_loader/efi_file.c index 95b3c890ee..e72bc36aca 100644 --- a/lib/efi_loader/efi_file.c +++ b/lib/efi_loader/efi_file.c @@ -38,7 +38,7 @@ struct file_handle { struct fs_dir_stream *dirs; struct fs_dirent *dent;
- char path[0]; + char *path; }; #define to_fh(x) container_of(x, struct file_handle, base)
@@ -176,6 +176,7 @@ static struct efi_file_handle *file_open(struct file_system *fs, u64 attributes) { struct file_handle *fh; + char *path; char f0[MAX_UTF8_PER_UTF16] = {0}; int plen = 0; int flen = 0; @@ -192,11 +193,13 @@ static struct efi_file_handle *file_open(struct file_system *fs, plen = strlen(parent->path) + 1; }
+ fh = calloc(1, sizeof(*fh)); /* +2 is for null and '/' */ - fh = calloc(1, sizeof(*fh) + plen + (flen * MAX_UTF8_PER_UTF16) + 2); - if (!fh) - return NULL; + path = calloc(1, plen + (flen * MAX_UTF8_PER_UTF16) + 2); + if (!fh || !path) + goto error;
+ fh->path = path; fh->open_mode = open_mode; fh->base = efi_file_handle_protocol; fh->fs = fs; @@ -243,6 +246,7 @@ static struct efi_file_handle *file_open(struct file_system *fs, return &fh->base;
error: + free(fh->path); free(fh); return NULL; } @@ -366,6 +370,7 @@ out: static efi_status_t file_close(struct file_handle *fh) { fs_closedir(fh->dirs); + free(fh->path); free(fh); return EFI_SUCCESS; }