Skip to content

Commit 14662a6

Browse files
committed
avoid close srt stream if receive certain control packets without body
1 parent 15f5a40 commit 14662a6

11 files changed

Lines changed: 66 additions & 16 deletions

File tree

srt/src/main/java/com/pedro/srt/srt/SrtClient.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -373,9 +373,6 @@ class SrtClient(private val connectChecker: ConnectChecker) {
373373
}
374374
is ControlPacket -> {
375375
when (srtPacket) {
376-
is Handshake -> {
377-
//never should happens, handshake is already done
378-
}
379376
is KeepAlive -> {
380377
commandsManager.writeKeepAlive(socket)
381378
}
@@ -393,27 +390,24 @@ class SrtClient(private val connectChecker: ConnectChecker) {
393390
val lostRanges = srtPacket.getNakRanges()
394391
this.packetsLost += srtPacket.getLostCount()
395392
commandsManager.reSendPackets(lostRanges, socket)
396-
}
397-
is CongestionWarning -> {
398-
399393
}
400394
is Shutdown -> {
401395
onMainThread {
402396
connectChecker.onConnectionFailed("Shutdown received from server")
403397
}
404-
}
405-
is Ack2 -> {
406-
//never should happens
407-
}
408-
is DropReq -> {
409-
410398
}
411399
is PeerError -> {
412400
val reason = srtPacket.errorCode
413401
onMainThread {
414402
connectChecker.onConnectionFailed("PeerError: $reason")
415403
}
416404
}
405+
is Handshake -> {
406+
//this never should happen, handshake is already done
407+
}
408+
is Ack2, is DropReq, is CongestionWarning -> {
409+
//this never should happen
410+
}
417411
}
418412
}
419413
}

srt/src/main/java/com/pedro/srt/srt/packets/control/Ack2.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class Ack2(
3737
fun read(input: InputStream) {
3838
super.readHeader(input)
3939
acknowledgementNumber = typeSpecificInformation
40-
input.readUInt32()
40+
if (input.available() >= 4) input.readUInt32()
4141
}
4242

4343
override fun toString(): String {

srt/src/main/java/com/pedro/srt/srt/packets/control/CongestionWarning.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class CongestionWarning: ControlPacket(ControlType.CONGESTION_WARNING) {
3333

3434
fun read(input: InputStream) {
3535
super.readHeader(input)
36-
input.readUInt32()
36+
if (input.available() >= 4) input.readUInt32()
3737
}
3838

3939
override fun toString(): String {

srt/src/main/java/com/pedro/srt/srt/packets/control/DropReq.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class DropReq(
4848
}
4949

5050
private fun readBody(input: InputStream) {
51+
if (input.available() < 8) return
5152
firstPacketSequenceNumber = input.readUInt32() and 0x7FFFFFFF //31 bits
5253
lastPacketSequenceNumber = input.readUInt32() and 0x7FFFFFFF //31 bits
5354
}

srt/src/main/java/com/pedro/srt/srt/packets/control/KeepAlive.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class KeepAlive: ControlPacket(ControlType.KEEP_ALIVE) {
3333

3434
fun read(input: InputStream) {
3535
super.readHeader(input)
36-
input.readUInt32()
36+
if (input.available() >= 4) input.readUInt32()
3737
}
3838

3939
override fun toString(): String {

srt/src/main/java/com/pedro/srt/srt/packets/control/Shutdown.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class Shutdown: ControlPacket(ControlType.SHUTDOWN) {
3333

3434
fun read(input: InputStream) {
3535
super.readHeader(input)
36-
input.readUInt32()
36+
if (input.available() >= 4) input.readUInt32()
3737
}
3838

3939
override fun toString(): String {

srt/src/test/java/com/pedro/srt/srt/control/Ack2Test.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,15 @@ class Ack2Test {
4949
packet.read(ByteArrayInputStream(buffer))
5050
Utils.assertObjectEquals(packet, expectedPacket)
5151
}
52+
53+
@Test
54+
fun `GIVEN a buffer without control info field WHEN read buffer as ack2 packet THEN get expected ack2 packet`() {
55+
val buffer = byteArrayOf(-128, 6, 0, 0, 0, 0, 0, 5, 0, 0, 9, -60, 0, 0, 0, 64)
56+
val expectedPacket = Ack2(
57+
acknowledgementNumber = 5
58+
)
59+
val packet = Ack2()
60+
packet.read(ByteArrayInputStream(buffer))
61+
Utils.assertObjectEquals(packet, expectedPacket)
62+
}
5263
}

srt/src/test/java/com/pedro/srt/srt/control/CongestionWarningTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,14 @@ class CongestionWarningTest {
4646

4747
Utils.assertObjectEquals(expectedPacket, packet)
4848
}
49+
50+
@Test
51+
fun `GIVEN a buffer without control info field WHEN read buffer as congestion warning packet THEN get expected congestion warning packet`() {
52+
val buffer = byteArrayOf(-128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 9, -60, 0, 0, 0, 64)
53+
val expectedPacket = CongestionWarning()
54+
val packet = CongestionWarning()
55+
packet.read(ByteArrayInputStream(buffer))
56+
57+
Utils.assertObjectEquals(expectedPacket, packet)
58+
}
4959
}

srt/src/test/java/com/pedro/srt/srt/control/DropReqTest.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,18 @@ class DropReqTest {
5454

5555
Utils.assertObjectEquals(expectedPacket, packet)
5656
}
57+
58+
@Test
59+
fun `GIVEN a truncated drop req buffer WHEN read buffer as drop req packet THEN discard sequence numbers`() {
60+
val buffer = byteArrayOf(-128, 7, 0, 0, 0, 0, 0, 5, 0, 0, 9, -60, 0, 0, 0, 64, 0, 0, 0, 1)
61+
val expectedPacket = DropReq(
62+
messageNumber = 5,
63+
firstPacketSequenceNumber = 0,
64+
lastPacketSequenceNumber = 0
65+
)
66+
val packet = DropReq()
67+
packet.read(ByteArrayInputStream(buffer))
68+
69+
Utils.assertObjectEquals(expectedPacket, packet)
70+
}
5771
}

srt/src/test/java/com/pedro/srt/srt/control/KeepAliveTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,14 @@ class KeepAliveTest {
4646

4747
Utils.assertObjectEquals(expectedPacket, packet)
4848
}
49+
50+
@Test
51+
fun `GIVEN a buffer without control info field WHEN read buffer as keep alive packet THEN get expected keep alive packet`() {
52+
val buffer = byteArrayOf(-128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9, -60, 0, 0, 0, 64)
53+
val expectedPacket = KeepAlive()
54+
val packet = KeepAlive()
55+
packet.read(ByteArrayInputStream(buffer))
56+
57+
Utils.assertObjectEquals(expectedPacket, packet)
58+
}
4959
}

0 commit comments

Comments
 (0)