Skip to content

Commit 55b091e

Browse files
authored
Handle corrupt preferences files (#129)
1 parent b33f925 commit 55b091e

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
@@ -47,7 +47,11 @@ void dumpPrefs(fs::FS &fs){
4747
if (fs.exists(PREFERENCES_FILE)) {
4848
// Dump contents for debug
4949
File file = fs.open(PREFERENCES_FILE, FILE_READ);
50-
while (file.available()) Serial.print(char(file.read()));
50+
int countSize = 0;
51+
while (file.available() && countSize <= PREFERENCES_MAX_SIZE) {
52+
Serial.print(char(file.read()));
53+
countSize++;
54+
}
5155
Serial.println("");
5256
file.close();
5357
} else {
@@ -62,15 +66,25 @@ void loadPrefs(fs::FS &fs){
6266
Serial.printf("Loading preferences from file %s\r\n", PREFERENCES_FILE);
6367
File file = fs.open(PREFERENCES_FILE, FILE_READ);
6468
if (!file) {
65-
Serial.println("Failed to open preferences file");
69+
Serial.println("Failed to open preferences file for reading, maybe corrupt, removing");
70+
removePrefs(SPIFFS);
6671
return;
6772
}
6873
size_t size = file.size();
69-
if (size > 800) {
70-
Serial.println("Preferences file size is too large, maybe corrupt");
74+
if (size > PREFERENCES_MAX_SIZE) {
75+
Serial.println("Preferences file size is too large, maybe corrupt, removing");
76+
removePrefs(SPIFFS);
7177
return;
7278
}
73-
while (file.available()) prefs += char(file.read());
79+
while (file.available()) {
80+
prefs += char(file.read());
81+
if (prefs.length() > size) {
82+
// corrupted SPIFFS files can return data beyond their declared size.
83+
Serial.println("Preferences file failed to load properly, appears to be corrupt, removing");
84+
removePrefs(SPIFFS);
85+
return;
86+
}
87+
}
7488
// get sensor reference
7589
sensor_t * s = esp_camera_sensor_get();
7690
// 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

0 commit comments

Comments
 (0)