Skip to content

Commit fc158df

Browse files
committed
checking for corruption when starting buffer #1
1 parent 4fc786a commit fc158df

3 files changed

Lines changed: 35 additions & 13 deletions

File tree

src/LogBuffer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ struct LogRecord {
1818
class LogBuffer {
1919

2020
public:
21-
virtual void begin(int clear = 0);
21+
virtual int begin(int clear = 0); // returns zero if failed
2222
virtual void stop();
2323

2424
virtual unsigned int size()=0;

src/LogBufferSPIFFS.cpp

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,31 @@ LogBufferSPIFFS::~LogBufferSPIFFS(){
2121
stop();
2222
}
2323

24-
void LogBufferSPIFFS::begin(int clear){
24+
int LogBufferSPIFFS::begin(int clear){
2525
const char *mode;
26+
uint8_t b;
2627

27-
DEBUG_PRINT("[lbSPF:begin] opening buffer files\n");
28-
if (clear || !SPIFFS.exists(_logFName))
28+
DEBUG_PRINT("[lbSPF:begin] opening buffer files clear=%d, exists=%d\n",clear,SPIFFS.exists(_logFName) );
29+
if (clear || !SPIFFS.exists(_logFName)) {
2930
mode="w+";
30-
else
31+
} else {
3132
mode="r+";
33+
}
3234

3335
_logFile = SPIFFS.open(_logFName, mode);
3436
if (!_logFile) {
3537
DEBUG_PRINT("[lbSPF:begin] failed opening buffer\n");
36-
return;
38+
return 0;
3739
}
3840

3941
DEBUG_PRINT("[lbSPF:begin] buffer file available\n");
4042

43+
// do test read in order to detect corrupted file
44+
if (_logFile.available() && _logFile.read(&b,1) != 1){
45+
DEBUG_PRINT("[lbSPF:begin] ERROR - buffer file corrupted\n");
46+
return 0;
47+
}
48+
4149
//DEBUG_PRINT("[lbSPF:begin] rpos=%lu wpos=%lu\n", _rfilepos, _wfilepos);
4250
// set reading position to the first "new" record or EOF, start search from begin
4351
_rfilepos = seekNext(MARK_NEW, 1);
@@ -50,8 +58,9 @@ void LogBufferSPIFFS::begin(int clear){
5058
_noNewRecords = 1;
5159
}
5260

53-
5461
//DEBUG_PRINT("[lbSPF:begin] adjusted rpos=%lu wpos=%lu\n", _rfilepos, _wfilepos);
62+
63+
return 1;
5564
}
5665

5766
void LogBufferSPIFFS::stop(){
@@ -73,14 +82,21 @@ uint32_t LogBufferSPIFFS::seekNext(char what, int fromStart){
7382
uint32_t pos = _logFile.position();
7483

7584
LogRecord buffer;
85+
buffer.mark = '~'; // force reading current position
7686

7787
if (fromStart) {
7888
_logFile.seek(0, SeekSet);
7989
pos = 0;
8090
}
8191

82-
while (buffer.mark != what && _logFile.available())
83-
_logFile.read((uint8_t*)&buffer,sizeof(buffer));
92+
size_t r = sizeof(buffer);
93+
size_t rr = r;
94+
95+
while (buffer.mark != what && r == rr && _logFile.available()) {
96+
//DEBUG_PRINT("here3 pos=%d avail=%d mark=%c what=%c\n",_logFile.position(), _logFile.available(), buffer.mark, what);
97+
r = _logFile.read((uint8_t*)&buffer, rr);
98+
//DEBUG_PRINT("read=%d\n", r);
99+
}
84100

85101
// if new record found, start reading from there
86102
if (buffer.mark == what) {
@@ -138,9 +154,10 @@ int LogBufferSPIFFS::write(LogRecord *rec){
138154

139155
int LogBufferSPIFFS::read(LogRecord *rec){
140156
//DEBUG_PRINT("[lbSPF:read] rpos1=%lu\n",_rfilepos);
157+
int recSize = sizeof(*rec);
141158

142159
_logFile.seek(_rfilepos, SeekSet);
143-
if (!_noNewRecords && _circular && !_logFile.available() && _logFile.size() > 0){
160+
if (!_noNewRecords && _circular && _logFile.available() >= recSize && _logFile.size() > 0){
144161
_rfilepos = seekNext(MARK_NEW, 1);
145162
if (!_logFile.available()){ // reached end trying to find next NEW record
146163
_noNewRecords = 1;
@@ -154,7 +171,12 @@ int LogBufferSPIFFS::read(LogRecord *rec){
154171
}
155172

156173
//DEBUG_PRINT("[lbSPF:read] rpos2=%lu size=%d\n",_logFile.position(),sizeof(*rec));
157-
uint r = _logFile.read((uint8_t*)rec,sizeof(*rec));
174+
uint r = _logFile.read((uint8_t*)rec, recSize);
175+
176+
if (r != recSize){
177+
DEBUG_PRINT("[lbSPF:read] record not read - buffer most likely corrupted\n");
178+
return 0;
179+
}
158180

159181
//DEBUG_PRINT("[lbSPF:read] read=%lu buff=",r);
160182
//DEBUG_ARRAYF((uint8_t*)rec,sizeof(*rec),"%c.");

src/LogBufferSPIFFS.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ class LogBufferSPIFFS : public LogBuffer {
2626

2727
public:
2828
LogBufferSPIFFS(const char* logFName, unsigned int size = BUFFER_MAX_RECORDS, int circular = 1);
29-
~LogBufferSPIFFS();
30-
void begin(int clear = 0) override;
29+
virtual ~LogBufferSPIFFS();
30+
int begin(int clear = 0) override;
3131
void stop() override;
3232
int isReady() override;
3333
int isEmpty() override { return _noNewRecords;};

0 commit comments

Comments
 (0)