@@ -41,11 +41,13 @@ extern int32_t spiffs_hal_write(uint32_t addr, uint32_t size, uint8_t *src);
41
41
extern int32_t spiffs_hal_erase (uint32_t addr, uint32_t size);
42
42
extern int32_t spiffs_hal_read (uint32_t addr, uint32_t size, uint8_t *dst);
43
43
44
- int getSpiffsMode (OpenMode openMode, AccessMode accessMode);
44
+ static int getSpiffsMode (OpenMode openMode, AccessMode accessMode);
45
+ static bool isSpiffsFilenameValid (const char * name);
45
46
46
47
class SPIFFSFileImpl ;
47
48
class SPIFFSDirImpl ;
48
49
50
+
49
51
class SPIFFSImpl : public FSImpl {
50
52
public:
51
53
SPIFFSImpl (uint32_t start, uint32_t size, uint32_t pageSize, uint32_t blockSize, uint32_t maxOpenFds)
@@ -63,6 +65,14 @@ class SPIFFSImpl : public FSImpl {
63
65
DirImplPtr openDir (const char * path) override ;
64
66
65
67
bool rename (const char * pathFrom, const char * pathTo) override {
68
+ if (!isSpiffsFilenameValid (pathFrom)) {
69
+ DEBUGV (" SPIFFSImpl::rename: invalid pathFrom=`%s`\r\n " , path);
70
+ return false ;
71
+ }
72
+ if (!isSpiffsFilenameValid (pathTo)) {
73
+ DEBUGV (" SPIFFSImpl::rename: invalid pathTo=`%s` \r\n " , path);
74
+ return false ;
75
+ }
66
76
auto rc = SPIFFS_rename (&_fs, pathFrom, pathTo);
67
77
if (rc != SPIFFS_OK) {
68
78
DEBUGV (" SPIFFS_rename: rc=%d, from=`%s`, to=`%s`\r\n " , rc,
@@ -86,6 +96,10 @@ class SPIFFSImpl : public FSImpl {
86
96
}
87
97
88
98
bool remove (const char * path) override {
99
+ if (!isSpiffsFilenameValid (path)) {
100
+ DEBUGV (" SPIFFSImpl::remove: invalid path=`%s`\r\n " , path);
101
+ return false ;
102
+ }
89
103
auto rc = SPIFFS_remove (&_fs, path);
90
104
if (rc != SPIFFS_OK) {
91
105
DEBUGV (" SPIFFS_remove: rc=%d path=`%s`\r\n " , rc, path);
@@ -229,7 +243,7 @@ class SPIFFSImpl : public FSImpl {
229
243
std::unique_ptr<uint8_t []> _cacheBuf;
230
244
};
231
245
232
- #define CHECKFD () while (_fd == 0 ) { DEBUGV ( " SPIFFSFileImpl(%d) _fd == 0 \r\n " , __LINE__); abort (); }
246
+ #define CHECKFD () while (_fd == 0 ) { panic (); }
233
247
234
248
class SPIFFSFileImpl : public FileImpl {
235
249
public:
@@ -408,6 +422,10 @@ class SPIFFSDirImpl : public DirImpl {
408
422
409
423
410
424
FileImplPtr SPIFFSImpl::open (const char * path, OpenMode openMode, AccessMode accessMode) {
425
+ if (!isSpiffsFilenameValid (path)) {
426
+ DEBUGV (" SPIFFSImpl::open: invalid path=`%s` \r\n " , path);
427
+ return FileImplPtr ();
428
+ }
411
429
int mode = getSpiffsMode (openMode, accessMode);
412
430
int fd = SPIFFS_open (&_fs, path, mode, 0 );
413
431
if (fd < 0 && _fs.err_code == SPIFFS_ERR_DELETED && (openMode & OM_CREATE)) {
@@ -430,12 +448,20 @@ FileImplPtr SPIFFSImpl::open(const char* path, OpenMode openMode, AccessMode acc
430
448
}
431
449
432
450
bool SPIFFSImpl::exists (const char * path) {
451
+ if (!isSpiffsFilenameValid (path)) {
452
+ DEBUGV (" SPIFFSImpl::exists: invalid path=`%s` \r\n " , path);
453
+ return false ;
454
+ }
433
455
spiffs_stat stat;
434
456
int rc = SPIFFS_stat (&_fs, path, &stat);
435
457
return rc == SPIFFS_OK;
436
458
}
437
459
438
460
DirImplPtr SPIFFSImpl::openDir (const char * path) {
461
+ if (!isSpiffsFilenameValid (path)) {
462
+ DEBUGV (" SPIFFSImpl::openDir: invalid path=`%s` \r\n " , path);
463
+ return DirImplPtr ();
464
+ }
439
465
spiffs_DIR dir;
440
466
spiffs_DIR* result = SPIFFS_opendir (&_fs, path, &dir);
441
467
if (!result) {
@@ -445,7 +471,7 @@ DirImplPtr SPIFFSImpl::openDir(const char* path) {
445
471
return std::make_shared<SPIFFSDirImpl>(path, this , dir);
446
472
}
447
473
448
- int getSpiffsMode (OpenMode openMode, AccessMode accessMode) {
474
+ static int getSpiffsMode (OpenMode openMode, AccessMode accessMode) {
449
475
int mode = 0 ;
450
476
if (openMode & OM_CREATE) {
451
477
mode |= SPIFFS_CREAT;
@@ -465,6 +491,13 @@ int getSpiffsMode(OpenMode openMode, AccessMode accessMode) {
465
491
return mode;
466
492
}
467
493
494
+ static bool isSpiffsFilenameValid (const char * name) {
495
+ if (name == nullptr )
496
+ return false ;
497
+ auto len = strlen (name);
498
+ return len > 0 && len <= SPIFFS_OBJ_NAME_LEN;
499
+ }
500
+
468
501
// these symbols should be defined in the linker script for each flash layout
469
502
extern " C" uint32_t _SPIFFS_start;
470
503
extern " C" uint32_t _SPIFFS_end;
0 commit comments