@@ -41,11 +41,13 @@ extern int32_t spiffs_hal_write(uint32_t addr, uint32_t size, uint8_t *src);
4141extern int32_t spiffs_hal_erase (uint32_t addr, uint32_t size);
4242extern int32_t spiffs_hal_read (uint32_t addr, uint32_t size, uint8_t *dst);
4343
44- int getSpiffsMode (OpenMode openMode, AccessMode accessMode);
44+ static int getSpiffsMode (OpenMode openMode, AccessMode accessMode);
45+ static bool isSpiffsFilenameValid (const char * name);
4546
4647class SPIFFSFileImpl ;
4748class SPIFFSDirImpl ;
4849
50+
4951class SPIFFSImpl : public FSImpl {
5052public:
5153 SPIFFSImpl (uint32_t start, uint32_t size, uint32_t pageSize, uint32_t blockSize, uint32_t maxOpenFds)
@@ -63,6 +65,14 @@ class SPIFFSImpl : public FSImpl {
6365 DirImplPtr openDir (const char * path) override ;
6466
6567 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+ }
6676 auto rc = SPIFFS_rename (&_fs, pathFrom, pathTo);
6777 if (rc != SPIFFS_OK) {
6878 DEBUGV (" SPIFFS_rename: rc=%d, from=`%s`, to=`%s`\r\n " , rc,
@@ -86,6 +96,10 @@ class SPIFFSImpl : public FSImpl {
8696 }
8797
8898 bool remove (const char * path) override {
99+ if (!isSpiffsFilenameValid (path)) {
100+ DEBUGV (" SPIFFSImpl::remove: invalid path=`%s`\r\n " , path);
101+ return false ;
102+ }
89103 auto rc = SPIFFS_remove (&_fs, path);
90104 if (rc != SPIFFS_OK) {
91105 DEBUGV (" SPIFFS_remove: rc=%d path=`%s`\r\n " , rc, path);
@@ -229,7 +243,7 @@ class SPIFFSImpl : public FSImpl {
229243 std::unique_ptr<uint8_t []> _cacheBuf;
230244};
231245
232- #define CHECKFD () while (_fd == 0 ) { DEBUGV ( " SPIFFSFileImpl(%d) _fd == 0 \r\n " , __LINE__); abort (); }
246+ #define CHECKFD () while (_fd == 0 ) { panic (); }
233247
234248class SPIFFSFileImpl : public FileImpl {
235249public:
@@ -408,6 +422,10 @@ class SPIFFSDirImpl : public DirImpl {
408422
409423
410424FileImplPtr 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+ }
411429 int mode = getSpiffsMode (openMode, accessMode);
412430 int fd = SPIFFS_open (&_fs, path, mode, 0 );
413431 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
430448}
431449
432450bool SPIFFSImpl::exists (const char * path) {
451+ if (!isSpiffsFilenameValid (path)) {
452+ DEBUGV (" SPIFFSImpl::exists: invalid path=`%s` \r\n " , path);
453+ return false ;
454+ }
433455 spiffs_stat stat;
434456 int rc = SPIFFS_stat (&_fs, path, &stat);
435457 return rc == SPIFFS_OK;
436458}
437459
438460DirImplPtr SPIFFSImpl::openDir (const char * path) {
461+ if (!isSpiffsFilenameValid (path)) {
462+ DEBUGV (" SPIFFSImpl::openDir: invalid path=`%s` \r\n " , path);
463+ return DirImplPtr ();
464+ }
439465 spiffs_DIR dir;
440466 spiffs_DIR* result = SPIFFS_opendir (&_fs, path, &dir);
441467 if (!result) {
@@ -445,7 +471,7 @@ DirImplPtr SPIFFSImpl::openDir(const char* path) {
445471 return std::make_shared<SPIFFSDirImpl>(path, this , dir);
446472}
447473
448- int getSpiffsMode (OpenMode openMode, AccessMode accessMode) {
474+ static int getSpiffsMode (OpenMode openMode, AccessMode accessMode) {
449475 int mode = 0 ;
450476 if (openMode & OM_CREATE) {
451477 mode |= SPIFFS_CREAT;
@@ -465,6 +491,13 @@ int getSpiffsMode(OpenMode openMode, AccessMode accessMode) {
465491 return mode;
466492}
467493
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+
468501// these symbols should be defined in the linker script for each flash layout
469502extern " C" uint32_t _SPIFFS_start;
470503extern " C" uint32_t _SPIFFS_end;
0 commit comments