Skip to content

Commit e7024fb

Browse files
committed
SPIFFS: check if path length is valid (#1089)
1 parent 703aaf6 commit e7024fb

File tree

1 file changed

+36
-3
lines changed

1 file changed

+36
-3
lines changed

cores/esp8266/spiffs_api.cpp

+36-3
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,13 @@ extern int32_t spiffs_hal_write(uint32_t addr, uint32_t size, uint8_t *src);
4141
extern int32_t spiffs_hal_erase(uint32_t addr, uint32_t size);
4242
extern 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

4647
class SPIFFSFileImpl;
4748
class SPIFFSDirImpl;
4849

50+
4951
class SPIFFSImpl : public FSImpl {
5052
public:
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

234248
class SPIFFSFileImpl : public FileImpl {
235249
public:
@@ -408,6 +422,10 @@ class SPIFFSDirImpl : public DirImpl {
408422

409423

410424
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+
}
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

432450
bool 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

438460
DirImplPtr 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
469502
extern "C" uint32_t _SPIFFS_start;
470503
extern "C" uint32_t _SPIFFS_end;

0 commit comments

Comments
 (0)