summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2007-07-03 09:53:16 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2007-07-03 09:53:16 +0000
commitfe163c51786fe9d0a0bdf8d38ad32bcfc3a518ab (patch)
tree3847eed8a033d08217d0846f974f96aab856e114
parentc72824786a0e8c68921ebb9b72f02a2e80aaee17 (diff)
downloadrockbox-fe163c51786fe9d0a0bdf8d38ad32bcfc3a518ab.zip
rockbox-fe163c51786fe9d0a0bdf8d38ad32bcfc3a518ab.tar.gz
rockbox-fe163c51786fe9d0a0bdf8d38ad32bcfc3a518ab.tar.bz2
rockbox-fe163c51786fe9d0a0bdf8d38ad32bcfc3a518ab.tar.xz
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
-rw-r--r--firmware/drivers/fat.c70
1 files changed, 44 insertions, 26 deletions
diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c
index 142d750..e9f2b24 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;
}