Skip to content

Commit

Permalink
fs: fat: cannot write to subdirectories
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Alexander Graf <[email protected]>
  • Loading branch information
xypron authored and agraf committed Jul 25, 2018
1 parent 1fcb7ea commit 0dc1bfb
Showing 1 changed file with 15 additions and 1 deletion.
16 changes: 15 additions & 1 deletion fs/fat/fat_write.c
Original file line number Diff line number Diff line change
Expand Up @@ -909,9 +909,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;
Expand Down Expand Up @@ -971,6 +973,18 @@ 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 ISDIRDELIM(*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;
Expand Down

0 comments on commit 0dc1bfb

Please sign in to comment.