Message ID | 20180526083447.2917-2-xypron.glpk@gmx.de |
---|---|
State | Superseded, archived |
Headers | show |
Series | efi_loader: allow writing to FAT | expand |
On Sat, 26 May 2018 10:34:45 +0200 Heinrich Schuchardt <xypron.glpk@gmx.de> wrote: > fs_fat_write() is not able to write to subdirectories. > > Currently if a filepath with a leading slash is passed, the slash is > treated as part of the filename to be created in the root directory. > > Strip leading (back-)slashes. > > Check that the remaining filename does not contain any illegal > characters (<>:"/\|?*). This way we will throw an error when trying > to write to a subdirectory. > > Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> > --- > fs/fat/fat_write.c | 18 +++++++++++++++++- > 1 file changed, 17 insertions(+), 1 deletion(-) > > diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c > index 5ca8fcda73c..f32745febb4 100644 > --- a/fs/fat/fat_write.c > +++ b/fs/fat/fat_write.c > @@ -908,9 +908,11 @@ static int do_fat_write(const char *filename, > void *buffer, loff_t size, volume_info volinfo; > fsdata datablock; > fsdata *mydata = &datablock; > - int cursect; > + int cursect, i; > int ret = -1, name_len; > char l_filename[VFAT_MAXLEN_BYTES]; > + char bad[2] = " "; > + const char illegal[] = "<>:\"/\\|?*"; > > *actwrite = size; > dir_curclust = 0; > @@ -970,6 +972,20 @@ static int do_fat_write(const char *filename, > void *buffer, loff_t size, } > dentptr = (dir_entry *) do_fat_read_at_block; > > + /* Strip leading (back-)slashes */ > + while (*filename == '/') > + ++filename; > + while (*filename == '\\') > + ++filename; > + /* Check that the filename is valid */ > + for (i = 0; i < strlen(illegal); ++i) { > + *bad = illegal[i]; > + if (strstr(filename, bad)) { > + printf("FAT: illegal filename (%s)\n", > filename); > + return -1; > + } > + } > + > name_len = strlen(filename); > if (name_len >= VFAT_MAXLEN_BYTES) > name_len = VFAT_MAXLEN_BYTES - 1; Reviewed-by: Lukasz Majewski <lukma@denx.de> Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c index 5ca8fcda73c..f32745febb4 100644 --- a/fs/fat/fat_write.c +++ b/fs/fat/fat_write.c @@ -908,9 +908,11 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size, volume_info volinfo; fsdata datablock; fsdata *mydata = &datablock; - int cursect; + int cursect, i; int ret = -1, name_len; char l_filename[VFAT_MAXLEN_BYTES]; + char bad[2] = " "; + const char illegal[] = "<>:\"/\\|?*"; *actwrite = size; dir_curclust = 0; @@ -970,6 +972,20 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size, } dentptr = (dir_entry *) do_fat_read_at_block; + /* Strip leading (back-)slashes */ + while (*filename == '/') + ++filename; + while (*filename == '\\') + ++filename; + /* Check that the filename is valid */ + for (i = 0; i < strlen(illegal); ++i) { + *bad = illegal[i]; + if (strstr(filename, bad)) { + printf("FAT: illegal filename (%s)\n", filename); + return -1; + } + } + name_len = strlen(filename); if (name_len >= VFAT_MAXLEN_BYTES) name_len = VFAT_MAXLEN_BYTES - 1;
fs_fat_write() is not able to write to subdirectories. Currently if a filepath with a leading slash is passed, the slash is treated as part of the filename to be created in the root directory. Strip leading (back-)slashes. Check that the remaining filename does not contain any illegal characters (<>:"/\|?*). This way we will throw an error when trying to write to a subdirectory. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> --- fs/fat/fat_write.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)