From bd2e52af877f1ebb1400d71e15919d7341f2eb79 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Sat, 28 Dec 2024 05:09:26 +0300 Subject: [PATCH] rfb: fix code api passing invalid string length broken in c45a1ec097a5636f8fcd9e0f6921a94749ed05a4 converting from ptr to sv point to the null char, not the actual buffer storage end resulting sv length is off-by-one, unless converted to a string obj --- code/espurna/rfbridge.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/code/espurna/rfbridge.cpp b/code/espurna/rfbridge.cpp index 741e8eab..c994c7a7 100644 --- a/code/espurna/rfbridge.cpp +++ b/code/espurna/rfbridge.cpp @@ -51,6 +51,12 @@ void rfbOnCode(RfbCodeHandler handler) { _rfb_code_handlers.push_front(handler); } +static void _rfbCode(unsigned char protocol, espurna::StringView code) { + for (auto& handler : _rfb_code_handlers) { + handler(protocol, code); + } +} + // ----------------------------------------------------------------------------- // MATCH RECEIVED CODE WITH THE SPECIFIC RELAY ID // ----------------------------------------------------------------------------- @@ -729,12 +735,8 @@ void _rfbParse(uint8_t code, const std::vector& payload) { mqttSend(MQTT_TOPIC_RFIN, buffer, false, false); #endif - for (auto& handler : _rfb_code_handlers) { - const auto begin = std::begin(buffer) + 12; - const auto end = std::end(buffer); - handler(RfbDefaultProtocol, - espurna::StringView(begin, end)); - } + _rfbCode(RfbDefaultProtocol, + espurna::StringView(buffer).slice(12)); } break; } @@ -742,6 +744,7 @@ void _rfbParse(uint8_t code, const std::vector& payload) { case CodeRecvProto: case CodeRecvBucket: { _rfbAckImpl(); + char buffer[(RfbParser::MessageSizeMax * 2) + 1] = {0}; if (hexEncode(payload.data(), payload.size(), buffer, sizeof(buffer))) { DEBUG_MSG_P(PSTR("[RF] Received %s code: %s\n"), @@ -753,12 +756,8 @@ void _rfbParse(uint8_t code, const std::vector& payload) { #endif // ref. https://github.com/Portisch/RF-Bridge-EFM8BB1/wiki/0xA6#example-of-a-received-decoded-protocol - for (auto& handler : _rfb_code_handlers) { - const auto begin = std::begin(buffer) + 2; - const auto end = std::end(buffer); - handler(payload[0], - espurna::StringView(begin, end)); - } + _rfbCode(payload[0], + espurna::StringView(buffer).slice(2)); } else { DEBUG_MSG_P(PSTR("[RF] Received 0x%02X (%u bytes)\n"), code, payload.size()); }