From 13daf980af4f9623a49c6f103550925255b79f90 Mon Sep 17 00:00:00 2001 From: Yohan Totting Date: Mon, 8 Apr 2024 13:04:45 +0700 Subject: [PATCH] fix nil panic on packet buffer --- packetbuffers.go | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/packetbuffers.go b/packetbuffers.go index 2a9ed82..4cf064e 100644 --- a/packetbuffers.go +++ b/packetbuffers.go @@ -117,29 +117,37 @@ func (p *packetBuffers) Add(pkt *rtppool.RetainablePacket) error { Loop: for e := p.buffers.Back(); e != nil; e = e.Prev() { currentPkt := e.Value.(*rtppool.RetainablePacket) + + if err := currentPkt.Retain(); err != nil { + // already released + continue + } + if currentPkt.Header().SequenceNumber == pkt.Header().SequenceNumber { // glog.Warning("packet cache: packet sequence ", pkt.SequenceNumber, " already exists in the cache, will not adding the packet") - + currentPkt.Release() return ErrPacketDuplicate } if currentPkt.Header().SequenceNumber < pkt.Header().SequenceNumber && pkt.Header().SequenceNumber-currentPkt.Header().SequenceNumber < uint16SizeHalf { p.buffers.InsertAfter(pkt, e) - + currentPkt.Release() break Loop } if currentPkt.Header().SequenceNumber-pkt.Header().SequenceNumber > uint16SizeHalf { p.buffers.InsertAfter(pkt, e) - + currentPkt.Release() break Loop } if e.Prev() == nil { p.buffers.PushFront(pkt) - + currentPkt.Release() break Loop } + + currentPkt.Release() } return nil @@ -355,6 +363,13 @@ func (p *packetBuffers) WaitAvailablePacket() { func (p *packetBuffers) checkOrderedPacketAndRecordTimes() { for e := p.buffers.Front(); e != nil; e = e.Next() { pkt := e.Value.(*rtppool.RetainablePacket) + + // make sure call retain to prevent packet from being released when we are still using it + if err := pkt.Retain(); err != nil { + // already released + continue + } + currentSeq := pkt.Header().SequenceNumber latency := time.Since(pkt.AddedTime()) @@ -370,8 +385,12 @@ func (p *packetBuffers) checkOrderedPacketAndRecordTimes() { p.packetAvailableWait.Signal() } } else if latency > p.maxLatency { + // passed the max latency p.packetAvailableWait.Signal() } + + // release the packet after we are done with it + pkt.Release() } }