From 594adb550d11dbd2669dae6fb834ab504f48a371 Mon Sep 17 00:00:00 2001 From: Owen Carter Date: Wed, 30 Jun 2021 18:22:51 +0200 Subject: [PATCH] Handle corrupt preferences files (#129) --- storage.cpp | 24 +++++++++++++++++++----- storage.h | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/storage.cpp b/storage.cpp index 8061427..39bfb0b 100644 --- a/storage.cpp +++ b/storage.cpp @@ -49,7 +49,11 @@ void dumpPrefs(fs::FS &fs){ if (fs.exists(PREFERENCES_FILE)) { // Dump contents for debug File file = fs.open(PREFERENCES_FILE, FILE_READ); - while (file.available()) Serial.print(char(file.read())); + int countSize = 0; + while (file.available() && countSize <= PREFERENCES_MAX_SIZE) { + Serial.print(char(file.read())); + countSize++; + } Serial.println(""); file.close(); } else { @@ -64,15 +68,25 @@ void loadPrefs(fs::FS &fs){ Serial.printf("Loading preferences from file %s\r\n", PREFERENCES_FILE); File file = fs.open(PREFERENCES_FILE, FILE_READ); if (!file) { - Serial.println("Failed to open preferences file"); + Serial.println("Failed to open preferences file for reading, maybe corrupt, removing"); + removePrefs(SPIFFS); return; } size_t size = file.size(); - if (size > 800) { - Serial.println("Preferences file size is too large, maybe corrupt"); + if (size > PREFERENCES_MAX_SIZE) { + Serial.println("Preferences file size is too large, maybe corrupt, removing"); + removePrefs(SPIFFS); return; } - while (file.available()) prefs += char(file.read()); + while (file.available()) { + prefs += char(file.read()); + if (prefs.length() > size) { + // corrupted SPIFFS files can return data beyond their declared size. + Serial.println("Preferences file failed to load properly, appears to be corrupt, removing"); + removePrefs(SPIFFS); + return; + } + } // get sensor reference sensor_t * s = esp_camera_sensor_get(); // process all the settings diff --git a/storage.h b/storage.h index e5ae34c..a2d3064 100644 --- a/storage.h +++ b/storage.h @@ -2,6 +2,7 @@ #include "SPIFFS.h" #define FORMAT_SPIFFS_IF_FAILED true +#define PREFERENCES_MAX_SIZE 500 #define PREFERENCES_FILE "/esp32cam-preferences.json" #define FACE_DB_FILE "/esp32cam-facedb"