From 281221e9c9be8443224d86a03218e5067467121d Mon Sep 17 00:00:00 2001 From: Joey Stanford Date: Sun, 19 Jul 2026 08:48:40 -0600 Subject: [PATCH] fix: parse TraceData SNR count from path_sz flags Companion TraceData frames encode SNR count as pathLen >> (flags & 0x03), not as pathLen bytes. Reading pathLen SNRs overruns/underreads the frame on multi-hop traces and corrupts lastSnr. Carried as a pnpm patch in Colorado-Mesh/mesh-client. --- src/connection/connection.js | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/connection/connection.js b/src/connection/connection.js index af6f6d6..fd7d462 100644 --- a/src/connection/connection.js +++ b/src/connection/connection.js @@ -494,15 +494,26 @@ class Connection extends EventEmitter { onTraceDataPush(bufferReader) { const reserved = bufferReader.readByte(); const pathLen = bufferReader.readUInt8(); + const flags = bufferReader.readUInt8(); + const tag = bufferReader.readUInt32LE(); + const authCode = bufferReader.readUInt32LE(); + const path_sz = flags & 0x03; + const pathHashes = bufferReader.readBytes(pathLen); + // SNR count is pathLen >> path_sz (not pathLen); last SNR follows path SNRs. + const snrCount = pathLen >> path_sz; + const snrBytes = bufferReader.readBytes(snrCount + 1); + const pathSnrs = snrBytes.subarray(0, snrCount); + const lastSnr = + snrBytes.length > snrCount ? (snrBytes[snrCount] & 0xff) / 4 : 0; this.emit(Constants.PushCodes.TraceData, { reserved: reserved, pathLen: pathLen, - flags: bufferReader.readUInt8(), - tag: bufferReader.readUInt32LE(), - authCode: bufferReader.readUInt32LE(), - pathHashes: bufferReader.readBytes(pathLen), - pathSnrs: bufferReader.readBytes(pathLen), - lastSnr: bufferReader.readInt8() / 4, + flags: flags, + tag: tag, + authCode: authCode, + pathHashes: pathHashes, + pathSnrs: pathSnrs, + lastSnr: lastSnr, }); }