Skip to content

Commit 3012431

Browse files
committed
Do not validate non spec obu-size
1 parent 438d7da commit 3012431

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

codecs/av1_depacketizer.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,22 +138,29 @@ func (d *AV1Depacketizer) Unmarshal(payload []byte) (buff []byte, err error) {
138138

139139
// obu_has_size_field should be set to 0 for AV1 RTP packets.
140140
// But we still check it to be sure, if we get obu size we just use it, instead of calculating it.
141-
if obuHeader.HasSizeField {
141+
if obuHeader.HasSizeField { //nolint:nestif
142142
obuSize, n, err := obu.ReadLeb128(obuBuffer[obuHeader.Size():])
143143
if err != nil {
144144
return nil, err
145145
}
146146

147-
// We validate the obu_size_field if it is present.
148147
sizeFromOBUSize := obuHeader.Size() + int(obuSize) + int(n) //nolint:gosec
149148
if lengthField != sizeFromOBUSize {
150-
return nil, fmt.Errorf(
151-
"%w: OBU size %d does not match calculated size %d",
152-
errShortPacket, obuSize, sizeFromOBUSize,
153-
)
154-
}
149+
payloadOffset := obuHeader.Size() + int(n) //nolint:gosec // n is a single digit
150+
if payloadOffset > len(obuBuffer) {
151+
return nil, fmt.Errorf(
152+
"%w: OBU header/size exceeds payload length %d",
153+
errShortPacket, len(obuBuffer),
154+
)
155+
}
155156

156-
buff = append(buff, obuBuffer...)
157+
obuPayloadSize := len(obuBuffer) - payloadOffset
158+
buff = append(buff, obuHeader.Marshal()...)
159+
buff = append(buff, obu.WriteToLeb128(uint(obuPayloadSize))...) // nolint: gosec // G104
160+
buff = append(buff, obuBuffer[payloadOffset:]...)
161+
} else {
162+
buff = append(buff, obuBuffer...)
163+
}
157164
} else {
158165
obuHeader.HasSizeField = true
159166
buff = append(buff, obuHeader.Marshal()...)

codecs/av1_depacketizer_test.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ func TestAV1Depacketizer_validateOBUSize(t *testing.T) {
114114
tests := []struct {
115115
name string
116116
payload []byte
117+
expect []byte
117118
err error
118119
}{
119120
{
@@ -135,7 +136,11 @@ func TestAV1Depacketizer_validateOBUSize(t *testing.T) {
135136
0x04, // LEB128 size
136137
0x03, 0x01, 0x02, // OBU data
137138
},
138-
err: errShortPacket,
139+
expect: []byte{
140+
0x22, // OBU header
141+
0x03, // Corrected size
142+
0x03, 0x01, 0x02, // OBU data
143+
},
139144
},
140145
{
141146
name: "OBU size smaller than length field",
@@ -146,15 +151,26 @@ func TestAV1Depacketizer_validateOBUSize(t *testing.T) {
146151
0x02, // LEB128 size
147152
0x03, 0x01, 0x02, // OBU data
148153
},
149-
err: errShortPacket,
154+
expect: []byte{
155+
0x22, // OBU header
156+
0x03, // Corrected size
157+
0x03, 0x01, 0x02, // OBU data
158+
},
150159
},
151160
}
152161

153162
for _, tt := range tests {
154163
t.Run(tt.name, func(t *testing.T) {
155164
d := AV1Depacketizer{}
156-
_, err := d.Unmarshal(tt.payload)
157-
assert.ErrorIs(t, err, tt.err)
165+
obu, err := d.Unmarshal(tt.payload)
166+
if tt.err != nil {
167+
assert.ErrorIs(t, err, tt.err)
168+
169+
return
170+
}
171+
172+
assert.NoError(t, err)
173+
assert.Equal(t, tt.expect, obu)
158174
})
159175
}
160176
}

0 commit comments

Comments
 (0)