@@ -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
5766void 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
139155int 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.");
0 commit comments