prevent decoding SDPs without media streams (#769)

This commit is contained in:
Alessandro Ros
2025-05-01 16:54:55 +02:00
committed by GitHub
parent 2e92a2a1f4
commit 162a72dd96
4 changed files with 28 additions and 6 deletions

View File

@@ -74,6 +74,10 @@ func (d *Session) Unmarshal(ssd *sdp.SessionDescription) error {
d.Title = "" d.Title = ""
} }
if len(ssd.MediaDescriptions) == 0 {
return fmt.Errorf("no media streams are present in SDP")
}
d.Medias = make([]*Media, len(ssd.MediaDescriptions)) d.Medias = make([]*Media, len(ssd.MediaDescriptions))
for i, md := range ssd.MediaDescriptions { for i, md := range ssd.MediaDescriptions {

View File

@@ -768,12 +768,21 @@ func FuzzSessionUnmarshal(f *testing.F) {
"a=rtpmap:101 ulpfec/8000\r\n" + "a=rtpmap:101 ulpfec/8000\r\n" +
"a=mid:4\r\n") "a=mid:4\r\n")
f.Fuzz(func(_ *testing.T, enc string) { f.Fuzz(func(t *testing.T, enc string) {
var sd sdp.SessionDescription var sd sdp.SessionDescription
err := sd.Unmarshal([]byte(enc)) err := sd.Unmarshal([]byte(enc))
if err == nil { if err != nil {
var desc Session return
desc.Unmarshal(&sd) //nolint:errcheck
} }
var desc Session
err = desc.Unmarshal(&sd)
if err != nil {
return
}
require.NotZero(t, len(desc.Medias))
desc.Marshal(false) //nolint:errcheck
}) })
} }

View File

@@ -0,0 +1,2 @@
go test fuzz v1
string("")

View File

@@ -1271,8 +1271,15 @@ func FuzzUnmarshal(f *testing.F) {
var desc sdp.SessionDescription var desc sdp.SessionDescription
err := desc.Unmarshal([]byte(in)) err := desc.Unmarshal([]byte(in))
if err == nil && len(desc.MediaDescriptions) == 1 && len(desc.MediaDescriptions[0].MediaName.Formats) == 1 { if err == nil && len(desc.MediaDescriptions) >= 1 && len(desc.MediaDescriptions[0].MediaName.Formats) >= 1 {
Unmarshal(desc.MediaDescriptions[0], desc.MediaDescriptions[0].MediaName.Formats[0]) //nolint:errcheck f, err := Unmarshal(desc.MediaDescriptions[0], desc.MediaDescriptions[0].MediaName.Formats[0])
if err == nil {
f.Codec()
f.ClockRate()
f.PayloadType()
f.RTPMap()
f.FMTP()
}
} }
}) })
} }