summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-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 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 1175static 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}
1176static int fat_checkname(const unsigned char* newname) 1201static 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
1347static unsigned char char2dos(unsigned char c, int* randomize) 1381static 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