Skip to content

Commit d66c1ac

Browse files
authored
Merge pull request #1566 from bitcraze/tobba/eeprom_broken_or_corrupt_fix
Handle eeprom with no i2c answer and kvd header error.
2 parents 39542aa + 4ddf265 commit d66c1ac

File tree

3 files changed

+39
-16
lines changed

3 files changed

+39
-16
lines changed

src/hal/src/radiolink.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ void radiolinkSyslinkDispatch(SyslinkPacket *slp)
208208

209209
static int radiolinkReceiveCRTPPacket(CRTPPacket *p)
210210
{
211-
if (xQueueReceive(crtpPacketDelivery, p, M2T(100)) == pdTRUE)
211+
if (crtpPacketDelivery != 0 &&
212+
xQueueReceive(crtpPacketDelivery, p, M2T(100)) == pdTRUE)
212213
{
213214
return 0;
214215
}
@@ -231,7 +232,8 @@ static int radiolinkSendCRTPPacket(CRTPPacket *p)
231232
slp.length = p->size + 1;
232233
memcpy(slp.data, &p->header, p->size + 1);
233234

234-
if (xQueueSend(txQueue, &slp, M2T(100)) == pdTRUE)
235+
if (txQueue != 0 &&
236+
xQueueSend(txQueue, &slp, M2T(100)) == pdTRUE)
235237
{
236238
return true;
237239
}

src/utils/src/configblockeeprom.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,11 @@ int configblockInit(void)
170170
}
171171
}
172172
}
173+
else
174+
{
175+
cb_ok = false;
176+
return -1;
177+
}
173178

174179
if (cb_ok == false)
175180
{

src/utils/src/kve/kve_storage.c

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,9 @@ size_t kveStorageFindItemByPrefix(kveMemory_t *kve, size_t address,
140140
uint8_t searchedKeyLength = strlen(prefix);
141141

142142
while (currentAddress < (kve->memorySize - 3)) {
143-
kve->read(currentAddress, searchBuffer, 3);
143+
if (kve->read(currentAddress, searchBuffer, 3) == 0) {
144+
return KVE_STORAGE_INVALID_ADDRESS;
145+
}
144146
length = searchBuffer[0] + (searchBuffer[1]<<8);
145147
keyLength = searchBuffer[2];
146148

@@ -150,13 +152,15 @@ size_t kveStorageFindItemByPrefix(kveMemory_t *kve, size_t address,
150152
}
151153

152154
if (keyLength >= searchedKeyLength) {
153-
kve->read(currentAddress + 3, &searchBuffer, keyLength);
154-
if (!memcmp(prefix, searchBuffer, searchedKeyLength)) {
155-
memcpy(keyBuffer, searchBuffer, keyLength);
156-
keyBuffer[keyLength] = 0;
157-
*itemAddress = currentAddress;
158-
return length;
159-
}
155+
if (kve->read(currentAddress + 3, &searchBuffer, keyLength) == 0) {
156+
return KVE_STORAGE_INVALID_ADDRESS;
157+
}
158+
if (!memcmp(prefix, searchBuffer, searchedKeyLength)) {
159+
memcpy(keyBuffer, searchBuffer, keyLength);
160+
keyBuffer[keyLength] = 0;
161+
*itemAddress = currentAddress;
162+
return length;
163+
}
160164
}
161165

162166
currentAddress += length;
@@ -171,7 +175,9 @@ size_t kveStorageFindEnd(kveMemory_t *kve, size_t address) {
171175
kveItemHeader_t header;
172176

173177
while (currentAddress < (kve->memorySize - 2)) {
174-
kve->read(currentAddress, &header, sizeof(header));
178+
if (kve->read(currentAddress, &header, sizeof(header)) == 0) {
179+
return KVE_STORAGE_INVALID_ADDRESS;
180+
}
175181
if (header.full_length == KVE_END_TAG) {
176182
return currentAddress;
177183
}
@@ -192,7 +198,9 @@ size_t kveStorageFindHole(kveMemory_t *kve, size_t address) {
192198
kveItemHeader_t header;
193199

194200
while (currentAddress < (kve->memorySize - 2)) {
195-
kve->read(currentAddress, &header, sizeof(header));
201+
if (kve->read(currentAddress, &header, sizeof(header)) == 0) {
202+
return KVE_STORAGE_INVALID_ADDRESS;
203+
}
196204
if (header.key_length == 0) {
197205
return currentAddress;
198206
}
@@ -210,20 +218,28 @@ size_t kveStorageFindNextItem(kveMemory_t *kve, size_t address)
210218
kveItemHeader_t header;
211219

212220
// Jump over the current item
213-
kve->read(currentAddress, &header, sizeof(header));
221+
if (kve->read(currentAddress, &header, sizeof(header)) == 0) {
222+
return KVE_STORAGE_INVALID_ADDRESS;
223+
}
214224
if (header.full_length == KVE_END_TAG) {
215225
return KVE_STORAGE_INVALID_ADDRESS;
216226
}
227+
if (header.full_length == 0) {
228+
return KVE_STORAGE_INVALID_ADDRESS;
229+
}
217230
currentAddress += header.full_length;
218231

219232
while (currentAddress < (kve->memorySize - 3)) {
220-
kve->read(currentAddress, &header, sizeof(header));
221-
233+
if (kve->read(currentAddress, &header, sizeof(header)) == 0) {
234+
return KVE_STORAGE_INVALID_ADDRESS;
235+
}
222236

223237
if (header.full_length == KVE_END_TAG) {
224238
return KVE_STORAGE_INVALID_ADDRESS;
225239
}
226-
240+
if (header.full_length == 0) {
241+
return KVE_STORAGE_INVALID_ADDRESS;
242+
}
227243
if (header.key_length != 0) {
228244
return currentAddress;
229245
}

0 commit comments

Comments
 (0)