prevent decoders from emitting corrupted frames (#638)

This commit is contained in:
Alessandro Ros
2024-10-23 21:10:37 +02:00
committed by GitHub
parent f41b196241
commit 508d025097
21 changed files with 647 additions and 13 deletions

View File

@@ -35,6 +35,7 @@ type Decoder struct {
fragments [][]byte
fragmentsSize int
fragmentsExpected int
fragmentNextSeqNum uint16
}
// Init initializes the decoder.
@@ -106,6 +107,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, error) {
d.fragmentsSize = le
d.fragmentsExpected = size - le
d.fragments = append(d.fragments, pkt.Payload[2:])
d.fragmentNextSeqNum = pkt.SequenceNumber + 1
d.firstPacketReceived = true
return nil, ErrMorePacketsNeeded
@@ -118,6 +120,11 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, error) {
return nil, fmt.Errorf("received a subsequent fragment without previous fragments")
}
if pkt.SequenceNumber != d.fragmentNextSeqNum {
d.resetFragments()
return nil, fmt.Errorf("discarding frame since a RTP packet is missing")
}
le := len(pkt.Payload[2:])
d.fragmentsSize += le
d.fragmentsExpected -= le
@@ -128,6 +135,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, error) {
}
d.fragments = append(d.fragments, pkt.Payload[2:])
d.fragmentNextSeqNum++
if d.fragmentsExpected > 0 {
return nil, ErrMorePacketsNeeded