Skip to content

Commit 594adb5

Browse files
committed
Handle corrupt preferences files (#129)
1 parent 50d2a7d commit 594adb5

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

storage.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ void dumpPrefs(fs::FS &fs){
4949
if (fs.exists(PREFERENCES_FILE)) {
5050
// Dump contents for debug
5151
File file = fs.open(PREFERENCES_FILE, FILE_READ);
52-
while (file.available()) Serial.print(char(file.read()));
52+
int countSize = 0;
53+
while (file.available() && countSize <= PREFERENCES_MAX_SIZE) {
54+
Serial.print(char(file.read()));
55+
countSize++;
56+
}
5357
Serial.println("");
5458
file.close();
5559
} else {
@@ -64,15 +68,25 @@ void loadPrefs(fs::FS &fs){
6468
Serial.printf("Loading preferences from file %s\r\n", PREFERENCES_FILE);
6569
File file = fs.open(PREFERENCES_FILE, FILE_READ);
6670
if (!file) {
67-
Serial.println("Failed to open preferences file");
71+
Serial.println("Failed to open preferences file for reading, maybe corrupt, removing");
72+
removePrefs(SPIFFS);
6873
return;
6974
}
7075
size_t size = file.size();
71-
if (size > 800) {
72-
Serial.println("Preferences file size is too large, maybe corrupt");
76+
if (size > PREFERENCES_MAX_SIZE) {
77+
Serial.println("Preferences file size is too large, maybe corrupt, removing");
78+
removePrefs(SPIFFS);
7379
return;
7480
}
75-
while (file.available()) prefs += char(file.read());
81+
while (file.available()) {
82+
prefs += char(file.read());
83+
if (prefs.length() > size) {
84+
// corrupted SPIFFS files can return data beyond their declared size.
85+
Serial.println("Preferences file failed to load properly, appears to be corrupt, removing");
86+
removePrefs(SPIFFS);
87+
return;
88+
}
89+
}
7690
// get sensor reference
7791
sensor_t * s = esp_camera_sensor_get();
7892
// process all the settings

storage.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "SPIFFS.h"
33

44
#define FORMAT_SPIFFS_IF_FAILED true
5+
#define PREFERENCES_MAX_SIZE 500
56

67
#define PREFERENCES_FILE "/esp32cam-preferences.json"
78
#define FACE_DB_FILE "/esp32cam-facedb"

0 commit comments

Comments
 (0)