From e7024fb5b4d2eaa9a287dc58bc68467f9d979893 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Thu, 10 Dec 2015 23:25:54 +0300 Subject: [PATCH] SPIFFS: check if path length is valid (#1089) --- cores/esp8266/spiffs_api.cpp | 39 +++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/spiffs_api.cpp b/cores/esp8266/spiffs_api.cpp index f1689cbfe..f189b4d4e 100644 --- a/cores/esp8266/spiffs_api.cpp +++ b/cores/esp8266/spiffs_api.cpp @@ -41,11 +41,13 @@ extern int32_t spiffs_hal_write(uint32_t addr, uint32_t size, uint8_t *src); extern int32_t spiffs_hal_erase(uint32_t addr, uint32_t size); extern int32_t spiffs_hal_read(uint32_t addr, uint32_t size, uint8_t *dst); -int getSpiffsMode(OpenMode openMode, AccessMode accessMode); +static int getSpiffsMode(OpenMode openMode, AccessMode accessMode); +static bool isSpiffsFilenameValid(const char* name); class SPIFFSFileImpl; class SPIFFSDirImpl; + class SPIFFSImpl : public FSImpl { public: SPIFFSImpl(uint32_t start, uint32_t size, uint32_t pageSize, uint32_t blockSize, uint32_t maxOpenFds) @@ -63,6 +65,14 @@ public: DirImplPtr openDir(const char* path) override; bool rename(const char* pathFrom, const char* pathTo) override { + if (!isSpiffsFilenameValid(pathFrom)) { + DEBUGV("SPIFFSImpl::rename: invalid pathFrom=`%s`\r\n", path); + return false; + } + if (!isSpiffsFilenameValid(pathTo)) { + DEBUGV("SPIFFSImpl::rename: invalid pathTo=`%s` \r\n", path); + return false; + } auto rc = SPIFFS_rename(&_fs, pathFrom, pathTo); if (rc != SPIFFS_OK) { DEBUGV("SPIFFS_rename: rc=%d, from=`%s`, to=`%s`\r\n", rc, @@ -86,6 +96,10 @@ public: } bool remove(const char* path) override { + if (!isSpiffsFilenameValid(path)) { + DEBUGV("SPIFFSImpl::remove: invalid path=`%s`\r\n", path); + return false; + } auto rc = SPIFFS_remove(&_fs, path); if (rc != SPIFFS_OK) { DEBUGV("SPIFFS_remove: rc=%d path=`%s`\r\n", rc, path); @@ -229,7 +243,7 @@ protected: std::unique_ptr _cacheBuf; }; -#define CHECKFD() while (_fd == 0) { DEBUGV("SPIFFSFileImpl(%d) _fd == 0\r\n", __LINE__); abort(); } +#define CHECKFD() while (_fd == 0) { panic(); } class SPIFFSFileImpl : public FileImpl { public: @@ -408,6 +422,10 @@ protected: FileImplPtr SPIFFSImpl::open(const char* path, OpenMode openMode, AccessMode accessMode) { + if (!isSpiffsFilenameValid(path)) { + DEBUGV("SPIFFSImpl::open: invalid path=`%s` \r\n", path); + return FileImplPtr(); + } int mode = getSpiffsMode(openMode, accessMode); int fd = SPIFFS_open(&_fs, path, mode, 0); 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 } bool SPIFFSImpl::exists(const char* path) { + if (!isSpiffsFilenameValid(path)) { + DEBUGV("SPIFFSImpl::exists: invalid path=`%s` \r\n", path); + return false; + } spiffs_stat stat; int rc = SPIFFS_stat(&_fs, path, &stat); return rc == SPIFFS_OK; } DirImplPtr SPIFFSImpl::openDir(const char* path) { + if (!isSpiffsFilenameValid(path)) { + DEBUGV("SPIFFSImpl::openDir: invalid path=`%s` \r\n", path); + return DirImplPtr(); + } spiffs_DIR dir; spiffs_DIR* result = SPIFFS_opendir(&_fs, path, &dir); if (!result) { @@ -445,7 +471,7 @@ DirImplPtr SPIFFSImpl::openDir(const char* path) { return std::make_shared(path, this, dir); } -int getSpiffsMode(OpenMode openMode, AccessMode accessMode) { +static int getSpiffsMode(OpenMode openMode, AccessMode accessMode) { int mode = 0; if (openMode & OM_CREATE) { mode |= SPIFFS_CREAT; @@ -465,6 +491,13 @@ int getSpiffsMode(OpenMode openMode, AccessMode accessMode) { return mode; } +static bool isSpiffsFilenameValid(const char* name) { + if (name == nullptr) + return false; + auto len = strlen(name); + return len > 0 && len <= SPIFFS_OBJ_NAME_LEN; +} + // these symbols should be defined in the linker script for each flash layout extern "C" uint32_t _SPIFFS_start; extern "C" uint32_t _SPIFFS_end;