From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lukasz Majewski Date: Mon, 28 May 2018 09:30:26 +0200 Subject: [U-Boot] [RFC 1/3] fs: fat: cannot write to subdirectories In-Reply-To: <20180526083447.2917-2-xypron.glpk@gmx.de> References: <20180526083447.2917-1-xypron.glpk@gmx.de> <20180526083447.2917-2-xypron.glpk@gmx.de> Message-ID: <20180528093026.3f75a701@jawa> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Sat, 26 May 2018 10:34:45 +0200 Heinrich Schuchardt 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 > --- > 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 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 at denx.de -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 488 bytes Desc: OpenPGP digital signature URL: