From fe163c51786fe9d0a0bdf8d38ad32bcfc3a518ab Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Tue, 3 Jul 2007 09:53:16 +0000 Subject: Proper filename checking in the FAT driver (FS#7222 and FS#6358) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13770 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/fat.c | 70 +++++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 26 deletions(-) (limited to 'firmware/drivers') diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c index 142d750bde..e9f2b2442d 100644 --- a/firmware/drivers/fat.c +++ b/firmware/drivers/fat.c @@ -1172,13 +1172,47 @@ static int write_long_name(struct fat_file* file, return 0; } - +static bool is_char_legal(char c) +{ + switch(c) + { + case 0x22: /* " */ + case 0x2a: /* * */ + case 0x2b: /* + */ + case 0x2c: /* , */ + case 0x2e: /* . */ + case 0x3a: /* : */ + case 0x3b: /* ; */ + case 0x3c: /* < */ + case 0x3d: /* = */ + case 0x3e: /* > */ + case 0x3f: /* ? */ + case 0x5b: /* [ */ + case 0x5c: /* \ */ + case 0x5d: /* ] */ + case 0x7c: /* | */ + return false; + default: + if(c < 0x20) /* Control Characters */ + return false; + } + return true; +} static int fat_checkname(const unsigned char* newname) { + int len = strlen(newname); /* More sanity checks are probably needed */ - if ( newname[strlen(newname) - 1] == '.' ) { + if (len > 255 || newname[len - 1] == '.' || + newname[0] == ' ' || newname[len - 1] == ' ' ) + { return -1; } + while (*newname) + { + if (!is_char_legal(*newname)) + return -1; + newname++; + } return 0; } @@ -1346,35 +1380,19 @@ static int add_dir_entry(struct fat_dir* dir, static unsigned char char2dos(unsigned char c, int* randomize) { - switch(c) + if (!is_char_legal(c)) { - case 0x22: - case 0x2a: - case 0x2b: - case 0x2c: - case 0x2e: - case 0x3a: - case 0x3b: - case 0x3c: - case 0x3d: - case 0x3e: - case 0x3f: - case 0x5b: - case 0x5c: - case 0x5d: - case 0x7c: + if(c <= 0x20) + c = 0; /* Illegal char, remove */ + else + { /* Illegal char, replace */ c = '_'; *randomize = 1; /* as per FAT spec */ - break; - - default: - if(c <= 0x20) - c = 0; /* Illegal char, remove */ - else - c = toupper(c); - break; + } } + else + c = toupper(c); return c; } -- cgit v1.2.3