mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
client: return an error in case of invalid packet (#305)
when reading with TCP and packet has an unknown format.
This commit is contained in:
@@ -211,6 +211,7 @@ func (cm *clientMedia) readRTPTCPPlay(payload []byte) error {
|
|||||||
|
|
||||||
forma, ok := cm.formats[pkt.PayloadType]
|
forma, ok := cm.formats[pkt.PayloadType]
|
||||||
if !ok {
|
if !ok {
|
||||||
|
cm.c.OnDecodeError(fmt.Errorf("received RTP packet with unknown format: %d", pkt.PayloadType))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,7 +285,7 @@ func (cm *clientMedia) readRTPUDPPlay(payload []byte) error {
|
|||||||
|
|
||||||
forma, ok := cm.formats[pkt.PayloadType]
|
forma, ok := cm.formats[pkt.PayloadType]
|
||||||
if !ok {
|
if !ok {
|
||||||
cm.c.OnDecodeError(fmt.Errorf("received RTP packet with unknown payload type (%d)", pkt.PayloadType))
|
cm.c.OnDecodeError(fmt.Errorf("received RTP packet with unknown format: %d", pkt.PayloadType))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2885,8 +2885,10 @@ func TestClientPlayDecodeErrors(t *testing.T) {
|
|||||||
{"udp", "rtp packets lost"},
|
{"udp", "rtp packets lost"},
|
||||||
{"udp", "rtp too big"},
|
{"udp", "rtp too big"},
|
||||||
{"udp", "rtcp too big"},
|
{"udp", "rtcp too big"},
|
||||||
|
{"udp", "rtp unknown format"},
|
||||||
{"tcp", "rtcp invalid"},
|
{"tcp", "rtcp invalid"},
|
||||||
{"tcp", "rtcp too big"},
|
{"tcp", "rtcp too big"},
|
||||||
|
{"tcp", "rtp unknown format"},
|
||||||
} {
|
} {
|
||||||
t.Run(ca.proto+" "+ca.name, func(t *testing.T) {
|
t.Run(ca.proto+" "+ca.name, func(t *testing.T) {
|
||||||
errorRecv := make(chan struct{})
|
errorRecv := make(chan struct{})
|
||||||
@@ -3046,6 +3048,17 @@ func TestClientPlayDecodeErrors(t *testing.T) {
|
|||||||
Port: th.ClientPorts[1],
|
Port: th.ClientPorts[1],
|
||||||
})
|
})
|
||||||
|
|
||||||
|
case ca.proto == "udp" && ca.name == "rtp unknown format":
|
||||||
|
byts, _ := rtp.Packet{
|
||||||
|
Header: rtp.Header{
|
||||||
|
PayloadType: 111,
|
||||||
|
},
|
||||||
|
}.Marshal()
|
||||||
|
l1.WriteTo(byts, &net.UDPAddr{
|
||||||
|
IP: net.ParseIP("127.0.0.1"),
|
||||||
|
Port: th.ClientPorts[0],
|
||||||
|
})
|
||||||
|
|
||||||
case ca.proto == "tcp" && ca.name == "rtcp invalid":
|
case ca.proto == "tcp" && ca.name == "rtcp invalid":
|
||||||
err = conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
err = conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
||||||
Channel: 1,
|
Channel: 1,
|
||||||
@@ -3059,6 +3072,18 @@ func TestClientPlayDecodeErrors(t *testing.T) {
|
|||||||
Payload: bytes.Repeat([]byte{0x01, 0x02}, 2000/2),
|
Payload: bytes.Repeat([]byte{0x01, 0x02}, 2000/2),
|
||||||
}, make([]byte, 2048))
|
}, make([]byte, 2048))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
case ca.proto == "tcp" && ca.name == "rtp unknown format":
|
||||||
|
byts, _ := rtp.Packet{
|
||||||
|
Header: rtp.Header{
|
||||||
|
PayloadType: 111,
|
||||||
|
},
|
||||||
|
}.Marshal()
|
||||||
|
err = conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
||||||
|
Channel: 0,
|
||||||
|
Payload: byts,
|
||||||
|
}, make([]byte, 2048))
|
||||||
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req, err = conn.ReadRequest()
|
req, err = conn.ReadRequest()
|
||||||
@@ -3091,7 +3116,7 @@ func TestClientPlayDecodeErrors(t *testing.T) {
|
|||||||
case ca.proto == "udp" && ca.name == "rtp invalid":
|
case ca.proto == "udp" && ca.name == "rtp invalid":
|
||||||
require.EqualError(t, err, "RTP header size insufficient: 2 < 4")
|
require.EqualError(t, err, "RTP header size insufficient: 2 < 4")
|
||||||
|
|
||||||
case ca.proto == "udp" && ca.name == "rtcp invalid":
|
case ca.name == "rtcp invalid":
|
||||||
require.EqualError(t, err, "rtcp: packet too short")
|
require.EqualError(t, err, "rtcp: packet too short")
|
||||||
|
|
||||||
case ca.proto == "udp" && ca.name == "rtp too big":
|
case ca.proto == "udp" && ca.name == "rtp too big":
|
||||||
@@ -3100,11 +3125,11 @@ func TestClientPlayDecodeErrors(t *testing.T) {
|
|||||||
case ca.proto == "udp" && ca.name == "rtcp too big":
|
case ca.proto == "udp" && ca.name == "rtcp too big":
|
||||||
require.EqualError(t, err, "RTCP packet is too big to be read with UDP")
|
require.EqualError(t, err, "RTCP packet is too big to be read with UDP")
|
||||||
|
|
||||||
case ca.proto == "tcp" && ca.name == "rtcp invalid":
|
|
||||||
require.EqualError(t, err, "rtcp: packet too short")
|
|
||||||
|
|
||||||
case ca.proto == "tcp" && ca.name == "rtcp too big":
|
case ca.proto == "tcp" && ca.name == "rtcp too big":
|
||||||
require.EqualError(t, err, "RTCP packet size (2000) is greater than maximum allowed (1472)")
|
require.EqualError(t, err, "RTCP packet size (2000) is greater than maximum allowed (1472)")
|
||||||
|
|
||||||
|
case ca.name == "rtp unknown format":
|
||||||
|
require.EqualError(t, err, "received RTP packet with unknown format: 111")
|
||||||
}
|
}
|
||||||
close(errorRecv)
|
close(errorRecv)
|
||||||
},
|
},
|
||||||
|
@@ -1023,15 +1023,12 @@ func TestClientRecordDecodeErrors(t *testing.T) {
|
|||||||
}(),
|
}(),
|
||||||
OnDecodeError: func(err error) {
|
OnDecodeError: func(err error) {
|
||||||
switch {
|
switch {
|
||||||
case ca.proto == "udp" && ca.name == "rtcp invalid":
|
case ca.name == "rtcp invalid":
|
||||||
require.EqualError(t, err, "rtcp: packet too short")
|
require.EqualError(t, err, "rtcp: packet too short")
|
||||||
|
|
||||||
case ca.proto == "udp" && ca.name == "rtcp too big":
|
case ca.proto == "udp" && ca.name == "rtcp too big":
|
||||||
require.EqualError(t, err, "RTCP packet is too big to be read with UDP")
|
require.EqualError(t, err, "RTCP packet is too big to be read with UDP")
|
||||||
|
|
||||||
case ca.proto == "tcp" && ca.name == "rtcp invalid":
|
|
||||||
require.EqualError(t, err, "rtcp: packet too short")
|
|
||||||
|
|
||||||
case ca.proto == "tcp" && ca.name == "rtcp too big":
|
case ca.proto == "tcp" && ca.name == "rtcp too big":
|
||||||
require.EqualError(t, err, "RTCP packet size (2000) is greater than maximum allowed (1472)")
|
require.EqualError(t, err, "RTCP packet size (2000) is greater than maximum allowed (1472)")
|
||||||
}
|
}
|
||||||
|
@@ -1194,8 +1194,10 @@ func TestServerRecordDecodeErrors(t *testing.T) {
|
|||||||
{"udp", "rtp packets lost"},
|
{"udp", "rtp packets lost"},
|
||||||
{"udp", "rtp too big"},
|
{"udp", "rtp too big"},
|
||||||
{"udp", "rtcp too big"},
|
{"udp", "rtcp too big"},
|
||||||
|
{"udp", "rtp unknown format"},
|
||||||
{"tcp", "rtcp invalid"},
|
{"tcp", "rtcp invalid"},
|
||||||
{"tcp", "rtcp too big"},
|
{"tcp", "rtcp too big"},
|
||||||
|
{"tcp", "rtp unknown format"},
|
||||||
} {
|
} {
|
||||||
t.Run(ca.proto+" "+ca.name, func(t *testing.T) {
|
t.Run(ca.proto+" "+ca.name, func(t *testing.T) {
|
||||||
errorRecv := make(chan struct{})
|
errorRecv := make(chan struct{})
|
||||||
@@ -1228,7 +1230,7 @@ func TestServerRecordDecodeErrors(t *testing.T) {
|
|||||||
case ca.proto == "udp" && ca.name == "rtp invalid":
|
case ca.proto == "udp" && ca.name == "rtp invalid":
|
||||||
require.EqualError(t, ctx.Error, "RTP header size insufficient: 2 < 4")
|
require.EqualError(t, ctx.Error, "RTP header size insufficient: 2 < 4")
|
||||||
|
|
||||||
case ca.proto == "udp" && ca.name == "rtcp invalid":
|
case ca.name == "rtcp invalid":
|
||||||
require.EqualError(t, ctx.Error, "rtcp: packet too short")
|
require.EqualError(t, ctx.Error, "rtcp: packet too short")
|
||||||
|
|
||||||
case ca.proto == "udp" && ca.name == "rtp too big":
|
case ca.proto == "udp" && ca.name == "rtp too big":
|
||||||
@@ -1237,11 +1239,11 @@ func TestServerRecordDecodeErrors(t *testing.T) {
|
|||||||
case ca.proto == "udp" && ca.name == "rtcp too big":
|
case ca.proto == "udp" && ca.name == "rtcp too big":
|
||||||
require.EqualError(t, ctx.Error, "RTCP packet is too big to be read with UDP")
|
require.EqualError(t, ctx.Error, "RTCP packet is too big to be read with UDP")
|
||||||
|
|
||||||
case ca.proto == "tcp" && ca.name == "rtcp invalid":
|
|
||||||
require.EqualError(t, ctx.Error, "rtcp: packet too short")
|
|
||||||
|
|
||||||
case ca.proto == "tcp" && ca.name == "rtcp too big":
|
case ca.proto == "tcp" && ca.name == "rtcp too big":
|
||||||
require.EqualError(t, ctx.Error, "RTCP packet size (2000) is greater than maximum allowed (1472)")
|
require.EqualError(t, ctx.Error, "RTCP packet size (2000) is greater than maximum allowed (1472)")
|
||||||
|
|
||||||
|
case ca.name == "rtp unknown format":
|
||||||
|
require.EqualError(t, ctx.Error, "received RTP packet with unknown format: 111")
|
||||||
}
|
}
|
||||||
close(errorRecv)
|
close(errorRecv)
|
||||||
},
|
},
|
||||||
@@ -1357,6 +1359,17 @@ func TestServerRecordDecodeErrors(t *testing.T) {
|
|||||||
Port: resTH.ServerPorts[1],
|
Port: resTH.ServerPorts[1],
|
||||||
})
|
})
|
||||||
|
|
||||||
|
case ca.proto == "udp" && ca.name == "rtp unknown format":
|
||||||
|
byts, _ := rtp.Packet{
|
||||||
|
Header: rtp.Header{
|
||||||
|
PayloadType: 111,
|
||||||
|
},
|
||||||
|
}.Marshal()
|
||||||
|
l1.WriteTo(byts, &net.UDPAddr{
|
||||||
|
IP: net.ParseIP("127.0.0.1"),
|
||||||
|
Port: resTH.ServerPorts[0],
|
||||||
|
})
|
||||||
|
|
||||||
case ca.proto == "tcp" && ca.name == "rtcp invalid":
|
case ca.proto == "tcp" && ca.name == "rtcp invalid":
|
||||||
err = conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
err = conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
||||||
Channel: 1,
|
Channel: 1,
|
||||||
@@ -1370,6 +1383,18 @@ func TestServerRecordDecodeErrors(t *testing.T) {
|
|||||||
Payload: bytes.Repeat([]byte{0x01, 0x02}, 2000/2),
|
Payload: bytes.Repeat([]byte{0x01, 0x02}, 2000/2),
|
||||||
}, make([]byte, 2048))
|
}, make([]byte, 2048))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
case ca.proto == "tcp" && ca.name == "rtp unknown format":
|
||||||
|
byts, _ := rtp.Packet{
|
||||||
|
Header: rtp.Header{
|
||||||
|
PayloadType: 111,
|
||||||
|
},
|
||||||
|
}.Marshal()
|
||||||
|
err = conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
||||||
|
Channel: 0,
|
||||||
|
Payload: byts,
|
||||||
|
}, make([]byte, 2048))
|
||||||
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
<-errorRecv
|
<-errorRecv
|
||||||
|
@@ -194,7 +194,7 @@ func (sm *serverSessionMedia) readRTPUDPRecord(payload []byte) error {
|
|||||||
|
|
||||||
forma, ok := sm.formats[pkt.PayloadType]
|
forma, ok := sm.formats[pkt.PayloadType]
|
||||||
if !ok {
|
if !ok {
|
||||||
sm.ss.onDecodeError(fmt.Errorf("received RTP packet with unknown payload type (%d)", pkt.PayloadType))
|
sm.ss.onDecodeError(fmt.Errorf("received RTP packet with unknown format: %d", pkt.PayloadType))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,7 +273,7 @@ func (sm *serverSessionMedia) readRTPTCPRecord(payload []byte) error {
|
|||||||
|
|
||||||
forma, ok := sm.formats[pkt.PayloadType]
|
forma, ok := sm.formats[pkt.PayloadType]
|
||||||
if !ok {
|
if !ok {
|
||||||
sm.ss.onDecodeError(fmt.Errorf("received RTP packet with unknown payload type (%d)", pkt.PayloadType))
|
sm.ss.onDecodeError(fmt.Errorf("received RTP packet with unknown format: %d", pkt.PayloadType))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user