From 6f25ab158dfee2bf591010af4104b6b59bd86349 Mon Sep 17 00:00:00 2001 From: Andy Taylor Date: Tue, 9 Sep 2025 00:26:59 +0100 Subject: [PATCH 1/6] Fix free(): double free detected in tcache --- .vscode/settings.json | 6 ++++++ DStarHeader.cpp | 10 ++-------- DStarHeader.h | 4 +++- 3 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..fa7d551 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "*.embeddedhtml": "html", + "cstring": "cpp" + } +} \ No newline at end of file diff --git a/DStarHeader.cpp b/DStarHeader.cpp index 9c600bd..3316d35 100644 --- a/DStarHeader.cpp +++ b/DStarHeader.cpp @@ -25,20 +25,15 @@ #include CDStarHeader::CDStarHeader(const unsigned char* header) : -m_header(nullptr) +m_header() { assert(header != nullptr); - - m_header = new unsigned char[DSTAR_HEADER_LENGTH_BYTES]; - ::memcpy(m_header, header, DSTAR_HEADER_LENGTH_BYTES); } CDStarHeader::CDStarHeader() : -m_header(nullptr) +m_header() { - m_header = new unsigned char[DSTAR_HEADER_LENGTH_BYTES]; - ::memset(m_header, ' ', DSTAR_HEADER_LENGTH_BYTES); m_header[0U] = 0x00U; @@ -48,7 +43,6 @@ m_header(nullptr) CDStarHeader::~CDStarHeader() { - delete[] m_header; } CDStarHeader& CDStarHeader::operator=(const CDStarHeader& header) diff --git a/DStarHeader.h b/DStarHeader.h index 867f1da..838cc7d 100644 --- a/DStarHeader.h +++ b/DStarHeader.h @@ -19,6 +19,8 @@ #ifndef DStarHeader_H #define DStarHeader_H +#include "DStarDefines.h" + class CDStarHeader { public: CDStarHeader(const unsigned char* header); @@ -52,7 +54,7 @@ public: CDStarHeader& operator=(const CDStarHeader& header); private: - unsigned char* m_header; + unsigned char m_header[DSTAR_HEADER_LENGTH_BYTES]; }; #endif From aa3555083b1e7f38e9254ca4ac59e70dd98266b0 Mon Sep 17 00:00:00 2001 From: Andy Taylor Date: Tue, 16 Sep 2025 01:14:27 +0100 Subject: [PATCH 2/6] Artifact cleanup --- .vscode/settings.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index fa7d551..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "files.associations": { - "*.embeddedhtml": "html", - "cstring": "cpp" - } -} \ No newline at end of file From d4fa52272b2f267461dd8e873e868e2840ce0086 Mon Sep 17 00:00:00 2001 From: jimzah Date: Sat, 20 Sep 2025 12:50:46 +0100 Subject: [PATCH 3/6] RTM_VERSION: Should be RTM_VERSION Signed-off-by: jimzah --- NetworkInfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NetworkInfo.cpp b/NetworkInfo.cpp index 2073f05..514d03b 100644 --- a/NetworkInfo.cpp +++ b/NetworkInfo.cpp @@ -124,7 +124,7 @@ void CNetworkInfo::getNetworkInterface(unsigned char* info) struct rt_msghdr *rtm; for (char *p = buf; p < buf + size; p += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)p; - if (rtm->rtm_version != VERSION) + if (rtm->rtm_version != RTM_VERSION) continue; #if defined(__OpenBSD__) struct sockaddr_in *sa = (struct sockaddr_in *)(p + rtm->rtm_hdrlen); From c94276a7143f7f0bca3d580c086bb0d400eb0351 Mon Sep 17 00:00:00 2001 From: jimzah Date: Sat, 20 Sep 2025 12:57:49 +0100 Subject: [PATCH 4/6] FreeBSD: include libutil.h Signed-off-by: jimzah --- PseudoTTYController.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PseudoTTYController.cpp b/PseudoTTYController.cpp index d4c606a..b0678e7 100644 --- a/PseudoTTYController.cpp +++ b/PseudoTTYController.cpp @@ -34,6 +34,8 @@ #include #if defined(__linux__) #include +#elif defined(__FreeBSD__) + #include #else #include #endif From 7d105371e91beb1d9bc3b10f87deff2d24866c7a Mon Sep 17 00:00:00 2001 From: jimzah Date: Sat, 20 Sep 2025 13:10:10 +0100 Subject: [PATCH 5/6] Spacing Signed-off-by: jimzah --- PseudoTTYController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PseudoTTYController.cpp b/PseudoTTYController.cpp index b0678e7..2e7f9b3 100644 --- a/PseudoTTYController.cpp +++ b/PseudoTTYController.cpp @@ -35,7 +35,7 @@ #if defined(__linux__) #include #elif defined(__FreeBSD__) - #include + #include #else #include #endif From 025273844f6debff7509752dc3974f12bce7651b Mon Sep 17 00:00:00 2001 From: Andy Taylor Date: Wed, 24 Sep 2025 12:01:31 +0100 Subject: [PATCH 6/6] MMDVMHost Nextion Commands --- .gitignore | 1 + Modem.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- Modem.h | 4 ++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 14ab1c8..4009b5a 100644 --- a/.gitignore +++ b/.gitignore @@ -15,5 +15,6 @@ RemoteCommand *.user *.VC.db .vs +.vscode *.ambe GitVersion.h diff --git a/Modem.cpp b/Modem.cpp index 5e5aaa6..5838c5c 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -227,7 +227,8 @@ m_fmExtAudioBoost(1U), m_fmMaxDevLevel(90.0F), m_fmExtEnable(false), m_capabilities1(0x00U), -m_capabilities2(0x00U) +m_capabilities2(0x00U), +m_serialDataLen(0U) { m_buffer = new unsigned char[BUFFER_LENGTH]; } @@ -783,10 +784,61 @@ void CModem::clock(unsigned int ms) printDebug(); break; + //case MMDVM_SERIAL_DATA: + // if (m_trace) + // CUtils::dump(1U, "RX Serial Data", m_buffer, m_length); + // m_rxSerialData.addData(m_buffer + m_offset, m_length - m_offset); + // break; + + // Code changed to bring the Nextion Button Pushes back to life case MMDVM_SERIAL_DATA: if (m_trace) CUtils::dump(1U, "RX Serial Data", m_buffer, m_length); + + // Original: Add to serial data buffer m_rxSerialData.addData(m_buffer + m_offset, m_length - m_offset); + + // NEW: Buffer serial data and forward complete commands as transparent data + { + // Add received bytes to our accumulation buffer + for (unsigned int i = 0; i < (m_length - m_offset); i++) { + if (m_serialDataLen < 256) { + m_serialDataBuffer[m_serialDataLen++] = m_buffer[m_offset + i]; + + // Check for Nextion command terminator (0xFF 0xFF 0xFF) + if (m_serialDataLen >= 3 && + m_serialDataBuffer[m_serialDataLen - 3] == 0xFF && + m_serialDataBuffer[m_serialDataLen - 2] == 0xFF && + m_serialDataBuffer[m_serialDataLen - 1] == 0xFF) { + + // We have a complete command + // Add it to the RX transparent data queue so it will be forwarded to NextionDriver + // With sendFrameType=1, we need to include the frame type byte + + // Create a buffer with frame type byte + command data + unsigned char frameBuffer[260]; + frameBuffer[0] = 0x90; // Frame type: transparent data + ::memcpy(frameBuffer + 1, m_serialDataBuffer, m_serialDataLen); + + // Add length byte and data with frame type to RX queue + unsigned char len = m_serialDataLen + 1U; // +1 for frame type byte + m_rxTransparentData.addData(&len, 1U); + m_rxTransparentData.addData(frameBuffer, len); + + if (m_trace) { + CUtils::dump(1U, "Adding button command with frame type to RX Transparent queue", frameBuffer, len); + } + + // Reset buffer for next command + m_serialDataLen = 0U; + } + } else { + // Buffer overflow, reset + LogWarning("Serial data buffer overflow, resetting"); + m_serialDataLen = 0U; + } + } + } break; default: diff --git a/Modem.h b/Modem.h index 24cd4b2..0e7e95a 100644 --- a/Modem.h +++ b/Modem.h @@ -267,6 +267,10 @@ private: void printDebug(); RESP_TYPE_MMDVM getResponse(); + + // Added these for buffering serial data from display: + unsigned char m_serialDataBuffer[256]; + unsigned int m_serialDataLen; }; #endif