From 939240df3170c6ad8b4217ceebb991c68e5713da Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 8 Apr 2026 11:51:15 +0200 Subject: [PATCH] fix RTP payload aliasing in jitter buffer Copy RTP payload bytes when parsing packets so buffered packets do not retain slices into the shared UDP read buffer. Previously ParseRTPPacket() kept Payload as a subslice of the caller-provided buffer. Once the next ReadFromUDP() reused that buffer, any packet still waiting inside the jitter buffer would silently see corrupted payload data. In practice this could surface as clicks, artifacts, or silent audio on reordered AES67/RTP traffic without obvious decoder errors. Take an owned copy of the payload on parse so jitter-buffered packets remain stable even when the source read buffer is reused. --- aoiprxkit/rtp.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/aoiprxkit/rtp.go b/aoiprxkit/rtp.go index b2dc104..abee12e 100644 --- a/aoiprxkit/rtp.go +++ b/aoiprxkit/rtp.go @@ -63,6 +63,10 @@ func ParseRTPPacket(buf []byte) (RTPPacket, error) { } payload = payload[:len(payload)-padLen] } - p.Payload = payload + // ALIASING FIX: copy payload bytes before returning. The caller reuses + // the receive buffer on every ReadFromUDP call, so any RTPPacket stored + // in the jitter buffer for later delivery would have its Payload slice + // silently overwritten by the next incoming packet. + p.Payload = append([]byte(nil), payload...) return p, nil }