diff options
Diffstat (limited to 'firmware/common')
-rw-r--r-- | firmware/common/dir.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/firmware/common/dir.c b/firmware/common/dir.c index f7f61719a2..e1f4c064a0 100644 --- a/firmware/common/dir.c +++ b/firmware/common/dir.c | |||
@@ -29,7 +29,9 @@ static bool busy=false; | |||
29 | 29 | ||
30 | DIR* opendir(char* name) | 30 | DIR* opendir(char* name) |
31 | { | 31 | { |
32 | char namecopy[256]; | ||
32 | char* part; | 33 | char* part; |
34 | char* end; | ||
33 | struct fat_direntry entry; | 35 | struct fat_direntry entry; |
34 | struct fat_dir* dir = &(thedir.fatdir); | 36 | struct fat_dir* dir = &(thedir.fatdir); |
35 | 37 | ||
@@ -48,9 +50,11 @@ DIR* opendir(char* name) | |||
48 | return NULL; | 50 | return NULL; |
49 | } | 51 | } |
50 | 52 | ||
51 | /* fixme: strtok() is not thread safe, and fat_getnext() calls yield() */ | 53 | strncpy(namecopy,name,sizeof(namecopy)); |
52 | for ( part = strtok(name, "/"); part; | 54 | namecopy[sizeof(namecopy)-1] = 0; |
53 | part = strtok(NULL, "/")) { | 55 | |
56 | for ( part = strtok_r(namecopy, "/", &end); part; | ||
57 | part = strtok_r(NULL, "/", &end)) { | ||
54 | int partlen = strlen(part); | 58 | int partlen = strlen(part); |
55 | /* scan dir for name */ | 59 | /* scan dir for name */ |
56 | while (1) { | 60 | while (1) { |