mirror of
https://github.com/Show-maket/IR-protocol.git
synced 2026-09-18 19:13:58 +00:00
fix(rx): guard null encoder in auto-accept (B2), init accept fields (B4), fix dataBuffer OOB off-by-one (B3)
B2 (HIGH): IR_Decoder::_tick — encoder->sendAccept() без null-check; у Car decoder создан с encoder==nullptr → HardFault при приёме IR_MSG_DATA_ACCEPT. Добавлен guard. B4 (MEDIUM): acceptSendTimer/isWaitingAcceptSend/addrAcceptSendTo/acceptCustomByte не инициализировались → мусор мог спонтанно дёрнуть sendAccept. Дефолты в .h. B3 (HIGH): writeToBuffer — '>' вместо '>=' → при i_dataBuffer==dataByteSizeMax*8 (304) запись dataBuffer[38] за границей 38-байтового массива (packSize==0 runaway). Валидные кадры закрываются при <=248, не затронуты. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@ -166,7 +166,7 @@ void IR_Decoder::_tick()
|
|||||||
}
|
}
|
||||||
if (isWaitingAcceptSend && millis() - acceptSendTimer > acceptDelay)
|
if (isWaitingAcceptSend && millis() - acceptSendTimer > acceptDelay)
|
||||||
{
|
{
|
||||||
encoder->sendAccept(addrAcceptSendTo, acceptCustomByte);
|
if (encoder != nullptr) encoder->sendAccept(addrAcceptSendTo, acceptCustomByte); // B2: у Car decoder без парного энкодера (nullptr) → был HardFault
|
||||||
isWaitingAcceptSend = false;
|
isWaitingAcceptSend = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,12 +10,12 @@ private:
|
|||||||
static std::list<IR_Decoder*>& get_dec_list();
|
static std::list<IR_Decoder*>& get_dec_list();
|
||||||
void _tick();
|
void _tick();
|
||||||
|
|
||||||
uint32_t acceptSendTimer;
|
uint32_t acceptSendTimer = 0;
|
||||||
bool isWaitingAcceptSend;
|
bool isWaitingAcceptSend = false; // B4: без инициализации мусор мог дёрнуть sendAccept при старте
|
||||||
uint16_t addrAcceptSendTo;
|
uint16_t addrAcceptSendTo = 0;
|
||||||
|
|
||||||
uint16_t acceptDelay = IR_ResponseDelay;
|
uint16_t acceptDelay = IR_ResponseDelay;
|
||||||
uint8_t acceptCustomByte;
|
uint8_t acceptCustomByte = 0;
|
||||||
|
|
||||||
bool extiEnabled_ = false;
|
bool extiEnabled_ = false;
|
||||||
bool rxExtiPreemptConfigured_ = false;
|
bool rxExtiPreemptConfigured_ = false;
|
||||||
|
|||||||
@ -750,8 +750,8 @@ void IR_DecoderRaw::writeToBuffer(bool bit, bool packTraceInvertFix)
|
|||||||
#if !defined(IRDEBUG_SERIAL_PACK)
|
#if !defined(IRDEBUG_SERIAL_PACK)
|
||||||
(void)packTraceInvertFix;
|
(void)packTraceInvertFix;
|
||||||
#endif
|
#endif
|
||||||
if (i_dataBuffer > dataByteSizeMax * 8)
|
if (i_dataBuffer >= dataByteSizeMax * 8)
|
||||||
{ // проверка переполнения
|
{ // проверка переполнения (>=: иначе при i_dataBuffer==dataByteSizeMax*8 запись dataBuffer[38] за границей массива — B3)
|
||||||
isBufferOverflow = true;
|
isBufferOverflow = true;
|
||||||
#if IR_RX_BRIEF_LOG
|
#if IR_RX_BRIEF_LOG
|
||||||
rxBriefLog(RxBriefReason::BufferOverflow, i_dataBuffer, 0, micros());
|
rxBriefLog(RxBriefReason::BufferOverflow, i_dataBuffer, 0, micros());
|
||||||
|
|||||||
Reference in New Issue
Block a user