Handle corrupt preferences files (#129)

This commit is contained in:
Owen Carter 2021-06-30 18:22:51 +02:00 committed by Owen
parent 50d2a7d919
commit 594adb550d
2 changed files with 20 additions and 5 deletions

View File

@ -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

View File

@ -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"