diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2007-07-03 09:53:16 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2007-07-03 09:53:16 +0000 |
commit | fe163c51786fe9d0a0bdf8d38ad32bcfc3a518ab (patch) | |
tree | 3847eed8a033d08217d0846f974f96aab856e114 /firmware/drivers/fat.c | |
parent | c72824786a0e8c68921ebb9b72f02a2e80aaee17 (diff) | |
download | rockbox-fe163c51786fe9d0a0bdf8d38ad32bcfc3a518ab.tar.gz rockbox-fe163c51786fe9d0a0bdf8d38ad32bcfc3a518ab.zip |
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
Diffstat (limited to 'firmware/drivers/fat.c')
-rw-r--r-- | firmware/drivers/fat.c | 70 |
1 files changed, 44 insertions, 26 deletions
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, | |||
1172 | 1172 | ||
1173 | return 0; | 1173 | return 0; |
1174 | } | 1174 | } |
1175 | 1175 | static bool is_char_legal(char c) | |
1176 | { | ||
1177 | switch(c) | ||
1178 | { | ||
1179 | case 0x22: /* " */ | ||
1180 | case 0x2a: /* * */ | ||
1181 | case 0x2b: /* + */ | ||
1182 | case 0x2c: /* , */ | ||
1183 | case 0x2e: /* . */ | ||
1184 | case 0x3a: /* : */ | ||
1185 | case 0x3b: /* ; */ | ||
1186 | case 0x3c: /* < */ | ||
1187 | case 0x3d: /* = */ | ||
1188 | case 0x3e: /* > */ | ||
1189 | case 0x3f: /* ? */ | ||
1190 | case 0x5b: /* [ */ | ||
1191 | case 0x5c: /* \ */ | ||
1192 | case 0x5d: /* ] */ | ||
1193 | case 0x7c: /* | */ | ||
1194 | return false; | ||
1195 | default: | ||
1196 | if(c < 0x20) /* Control Characters */ | ||
1197 | return false; | ||
1198 | } | ||
1199 | return true; | ||
1200 | } | ||
1176 | static int fat_checkname(const unsigned char* newname) | 1201 | static int fat_checkname(const unsigned char* newname) |
1177 | { | 1202 | { |
1203 | int len = strlen(newname); | ||
1178 | /* More sanity checks are probably needed */ | 1204 | /* More sanity checks are probably needed */ |
1179 | if ( newname[strlen(newname) - 1] == '.' ) { | 1205 | if (len > 255 || newname[len - 1] == '.' || |
1206 | newname[0] == ' ' || newname[len - 1] == ' ' ) | ||
1207 | { | ||
1180 | return -1; | 1208 | return -1; |
1181 | } | 1209 | } |
1210 | while (*newname) | ||
1211 | { | ||
1212 | if (!is_char_legal(*newname)) | ||
1213 | return -1; | ||
1214 | newname++; | ||
1215 | } | ||
1182 | return 0; | 1216 | return 0; |
1183 | } | 1217 | } |
1184 | 1218 | ||
@@ -1346,35 +1380,19 @@ static int add_dir_entry(struct fat_dir* dir, | |||
1346 | 1380 | ||
1347 | static unsigned char char2dos(unsigned char c, int* randomize) | 1381 | static unsigned char char2dos(unsigned char c, int* randomize) |
1348 | { | 1382 | { |
1349 | switch(c) | 1383 | if (!is_char_legal(c)) |
1350 | { | 1384 | { |
1351 | case 0x22: | 1385 | if(c <= 0x20) |
1352 | case 0x2a: | 1386 | c = 0; /* Illegal char, remove */ |
1353 | case 0x2b: | 1387 | else |
1354 | case 0x2c: | 1388 | { |
1355 | case 0x2e: | ||
1356 | case 0x3a: | ||
1357 | case 0x3b: | ||
1358 | case 0x3c: | ||
1359 | case 0x3d: | ||
1360 | case 0x3e: | ||
1361 | case 0x3f: | ||
1362 | case 0x5b: | ||
1363 | case 0x5c: | ||
1364 | case 0x5d: | ||
1365 | case 0x7c: | ||
1366 | /* Illegal char, replace */ | 1389 | /* Illegal char, replace */ |
1367 | c = '_'; | 1390 | c = '_'; |
1368 | *randomize = 1; /* as per FAT spec */ | 1391 | *randomize = 1; /* as per FAT spec */ |
1369 | break; | 1392 | } |
1370 | |||
1371 | default: | ||
1372 | if(c <= 0x20) | ||
1373 | c = 0; /* Illegal char, remove */ | ||
1374 | else | ||
1375 | c = toupper(c); | ||
1376 | break; | ||
1377 | } | 1393 | } |
1394 | else | ||
1395 | c = toupper(c); | ||
1378 | return c; | 1396 | return c; |
1379 | } | 1397 | } |
1380 | 1398 | ||