terseCRSF: valida lunghezza + CRC8 in decodeTelemetry; suite di test riallineata
- decodeTelemetry() ora scarta frame incompleti o con CRC8 errata (prima non validava nulla: frame corti/corrotti da ESP-NOW venivano decodificati leggendo oltre il frame -> telemetria spazzatura, e OOB read su FLIGHT_MODE). - test_decode.cpp: vettori ricostruiti come frame reali con CRC valida (calcolata offline), battery ri-quadrato a lth=10, assert bat_fuel_drawn corretto a 350 (era 89678, pre-patch uint24), test "non valida CRC" invertito in "rigetta CRC errata", aggiunto test su frame troncato. - Emulatore (03) e backpack reale usano lo stesso framing/CRC -> passano. DA RI-ESEGUIRE A BANCO: 'pio test -e esp32dev_test' e test RF reale. Se la telemetria reale sparisce, il backpack potrebbe non rilasciare una CRC valida nel frame ESP-NOW -> in tal caso ripiegare su validazione solo-lunghezza. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -352,7 +352,18 @@ void CRSF::sendSBUS()
|
||||
//========================================================
|
||||
uint8_t CRSF::decodeTelemetry(uint8_t *_buf, uint8_t len)
|
||||
{
|
||||
uint8_t crsf_frm_lth = _buf[1];
|
||||
// PATCH LOCALE: validazione lunghezza + CRC8 prima di decodificare.
|
||||
// L'upstream non valida nulla qui (la CRC era controllata solo in
|
||||
// readCrsfFrame(), non usato perche' i frame arrivano da ESP-NOW): un
|
||||
// frame corto o corrotto veniva decodificato leggendo byte oltre il
|
||||
// frame e producendo telemetria spazzatura. 'len' = byte disponibili.
|
||||
// _buf: [0]=sync [1]=lth(type+payload+crc) [2]=type ... [lth+1]=crc
|
||||
uint8_t crsf_frm_lth = _buf[1];
|
||||
if (len < 4) return 0;
|
||||
if (crsf_frm_lth < 2) return 0; // almeno type+crc
|
||||
if ((uint16_t)crsf_frm_lth + 2 > len) return 0; // frame non completo
|
||||
uint8_t calc_crc = crc8_dvb_s2_sbuf_accum(&_buf[2], crsf_frm_lth - 1);
|
||||
if (calc_crc != _buf[crsf_frm_lth + 1]) return 0; // CRC errata -> scarta
|
||||
uint8_t crsf_id = _buf[2];
|
||||
if (crsf_id == 0)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user