diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 2671bfc..2be0582 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -862,6 +862,11 @@ void IR_DecoderRaw::writeToBuffer(bool bit, bool packTraceInvertFix) if (i_dataBuffer == 8 * msgBytes) { // Ппервый байт packSize = dataBuffer[0] & IR_MASK_MSG_INFO; + // B1: под-минимальная длина (1..2) физически не несёт CRC (min кадр = msg+crc = 3 байта) → шум/битьё. + // Без отсева packSize==1 даёт crcCheck(1-2) → len=255 → OOB-чтение dataBuffer[0..256] (массив 38). + // packSize>=3 (в т.ч. будущие компактные кадры) обрабатываются как обычно. + if (packSize != 0 && packSize < msgBytes + crcBytes) + isWrongPack = true; } // Тип приёма (для isReceive): выставляем сразу после первого байта, ДО проверки «Конец». @@ -872,8 +877,8 @@ void IR_DecoderRaw::writeToBuffer(bool bit, bool packTraceInvertFix) msgTypeReceive = (dataBuffer[0] >> 5) | 0b11111000; } - if (packSize && (i_dataBuffer == packSize * bitPerByte)) - { // Конец + if (packSize > crcBytes && (i_dataBuffer == packSize * bitPerByte)) + { // Конец (B1: packSize>crcBytes → crcCheck(packSize-crcBytes) не уходит в underflow/OOB) packInfo.buffer = dataBuffer; packInfo.crc = crcValue; packInfo.err = errors;