Skip to content

Commit c3b1fe5

Browse files
committed
Fix invalid extension parsing with RTP
Resolves #285
1 parent 20bbbcd commit c3b1fe5

File tree

2 files changed

+47
-14
lines changed

2 files changed

+47
-14
lines changed

pkg/rtp/packet.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,21 @@ func (p *Packet) Unmarshal(rawPacket []byte) error {
107107
}
108108

109109
if p.Extension {
110+
if len(rawPacket) < currOffset+4 {
111+
return errors.Errorf("RTP header size insufficient for extension; %d < %d", len(rawPacket), currOffset)
112+
}
113+
110114
p.ExtensionProfile = binary.BigEndian.Uint16(rawPacket[currOffset:])
111115
currOffset += 2
112-
extensionLength := binary.BigEndian.Uint16(rawPacket[currOffset:])
116+
extensionLength := int(binary.BigEndian.Uint16(rawPacket[currOffset:])) * 4
113117
currOffset += 2
114-
p.ExtensionPayload = rawPacket[currOffset : currOffset+int(extensionLength)]
115-
currOffset += len(p.ExtensionPayload) * 4
118+
119+
if len(rawPacket) < currOffset+extensionLength {
120+
return errors.Errorf("RTP header size insufficient for extension length; %d < %d", len(rawPacket), currOffset+extensionLength)
121+
}
122+
123+
p.ExtensionPayload = rawPacket[currOffset : currOffset+extensionLength]
124+
currOffset += len(p.ExtensionPayload)
116125
}
117126

118127
p.Payload = rawPacket[currOffset:]

pkg/rtp/packet_test.go

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,22 @@ func TestBasic(t *testing.T) {
1313
}
1414

1515
rawPkt := []byte{
16-
0x80, 0x60, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64,
17-
0x27, 0x82, 0x98, 0x36, 0xbe, 0x88, 0x9e,
16+
0x90, 0x60, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64,
17+
0x27, 0x82, 0x00, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x36, 0xbe, 0x88, 0x9e,
1818
}
1919
parsedPacket := &Packet{
20-
Raw: rawPkt,
21-
Version: 2,
22-
PayloadOffset: 12,
23-
PayloadType: 96,
24-
SequenceNumber: 27023,
25-
Timestamp: 3653407706,
26-
SSRC: 476325762,
27-
Payload: rawPkt[12:],
28-
CSRC: []uint32{},
20+
Raw: rawPkt,
21+
Extension: true,
22+
ExtensionProfile: 1,
23+
ExtensionPayload: []byte{0xFF, 0xFF, 0xFF, 0xFF},
24+
Version: 2,
25+
PayloadOffset: 20,
26+
PayloadType: 96,
27+
SequenceNumber: 27023,
28+
Timestamp: 3653407706,
29+
SSRC: 476325762,
30+
Payload: rawPkt[20:],
31+
CSRC: []uint32{},
2932
}
3033

3134
if err := p.Unmarshal(rawPkt); err != nil {
@@ -41,3 +44,24 @@ func TestBasic(t *testing.T) {
4144
t.Errorf("TestBasic marshal: got %#v, want %#v", raw, rawPkt)
4245
}
4346
}
47+
48+
func TestExtension(t *testing.T) {
49+
p := &Packet{}
50+
51+
missingExtensionPkt := []byte{
52+
0x90, 0x60, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64,
53+
0x27, 0x82,
54+
}
55+
if err := p.Unmarshal(missingExtensionPkt); err == nil {
56+
t.Fatal("Unmarshal did not error on packet with missing extension data")
57+
}
58+
59+
invalidExtensionLengthPkt := []byte{
60+
0x90, 0x60, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64,
61+
0x27, 0x82, 0x99, 0x99, 0x99, 0x99,
62+
}
63+
if err := p.Unmarshal(invalidExtensionLengthPkt); err == nil {
64+
t.Fatal("Unmarshal did not error on packet with invalid extension length")
65+
}
66+
67+
}

0 commit comments

Comments
 (0)