diff --git a/radio/src/gui/480x272/model_select.cpp b/radio/src/gui/480x272/model_select.cpp index 2bda99865..4718ea0cf 100644 --- a/radio/src/gui/480x272/model_select.cpp +++ b/radio/src/gui/480x272/model_select.cpp @@ -117,7 +117,7 @@ void onModelSelectMenu(const char * result) else if (result == STR_DUPLICATE_MODEL) { char duplicatedFilename[LEN_MODEL_FILENAME+1]; memcpy(duplicatedFilename, currentModel->name, sizeof(duplicatedFilename)); - if (findNextFileIndex(duplicatedFilename, MODELS_PATH)) { + if (findNextFileIndex(duplicatedFilename, LEN_MODEL_FILENAME, MODELS_PATH)) { sdCopyFile(currentModel->name, MODELS_PATH, duplicatedFilename, MODELS_PATH); modelslist.addModel(currentCategory, duplicatedFilename); unsigned int index = currentCategory->size() - 1; diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index 39e409672..3692cb4f0 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -75,20 +75,33 @@ char * getFileIndex(char * filename, unsigned int & value) return filename; } -int findNextFileIndex(char * filename, const char * directory) +uint8_t getDigitsCount(unsigned int value) +{ + uint8_t count = 1; + while (value >= 10) { + value /= 10; + ++count; + } + return count; +} + +int findNextFileIndex(char * filename, uint8_t size, const char * directory) { unsigned int index; char * indexPos = getFileIndex(filename, index); char extension[LEN_FILE_EXTENSION+1]; strncpy(extension, getFileExtension(filename), sizeof(extension)); - do { - char * pos = strAppendUnsigned(indexPos, ++index, 2); + while (1) { + index++; + if ((indexPos - filename) + getDigitsCount(index) + LEN_FILE_EXTENSION > size) { + return 0; + } + char * pos = strAppendUnsigned(indexPos, index); strAppend(pos, extension); if (!isFileAvailable(filename, directory)) { return index; } - } while (index < 99); - return 0; + } } bool isExtensionMatching(const char * extension, const char * pattern, uint8_t flags) diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index a64cd114a..a2269fd62 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -125,7 +125,7 @@ T * getFileExtension(T * filename, int size=0) #endif bool isFileAvailable(const char * filename); -int findNextFileIndex(char * filename, const char * directory); +int findNextFileIndex(char * filename, uint8_t size, const char * directory); const char * sdCopyFile(const char * src, const char * dest); const char * sdCopyFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir); diff --git a/radio/src/storage/sdcard_raw.cpp b/radio/src/storage/sdcard_raw.cpp index b27e2a211..6fa6e4eb7 100644 --- a/radio/src/storage/sdcard_raw.cpp +++ b/radio/src/storage/sdcard_raw.cpp @@ -218,7 +218,7 @@ const char * createModel() memset(filename, 0, sizeof(filename)); strcpy(filename, "model.bin"); - int index = findNextFileIndex(filename, MODELS_PATH); + int index = findNextFileIndex(filename, LEN_MODEL_FILENAME, MODELS_PATH); if (index > 0) { modelDefault(index); memcpy(g_eeGeneral.currModelFilename, filename, sizeof(g_eeGeneral.currModelFilename));