Skip to content
This repository was archived by the owner on Aug 23, 2022. It is now read-only.

Commit e229a19

Browse files
committed
Prevent crash in RTCP nack writing.
1 parent f5e4530 commit e229a19

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

src/transport_feedbacks/transport_layer_nack/mod.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -226,10 +226,13 @@ pub fn nack_pairs_from_sequence_numbers(seq_nos: &[u16]) -> Vec<NackPair> {
226226

227227
let mut pairs = vec![];
228228

229-
for seq in seq_nos.iter().skip(1) {
230-
if seq - nack_pair.packet_id > 16 {
229+
for &seq in seq_nos.iter().skip(1) {
230+
if seq == nack_pair.packet_id {
231+
continue;
232+
}
233+
if seq <= nack_pair.packet_id || seq - nack_pair.packet_id > 16 {
231234
pairs.push(nack_pair.clone());
232-
nack_pair.packet_id = *seq;
235+
nack_pair.packet_id = seq;
233236
continue;
234237
}
235238

src/transport_feedbacks/transport_layer_nack/transport_layer_nack_test.rs

+53
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,15 @@ fn test_transport_layer_nack_pair_generation() {
250250
lost_packets: 0x0,
251251
}],
252252
),
253+
// Make sure it doesn't crash.
254+
(
255+
"Single Sequence Number (duplicates)",
256+
vec![100u16, 100],
257+
vec![NackPair {
258+
packet_id: 100,
259+
lost_packets: 0x0,
260+
}],
261+
),
253262
(
254263
"Multiple in range, Single NACKPair",
255264
vec![100, 101, 105, 115],
@@ -276,6 +285,50 @@ fn test_transport_layer_nack_pair_generation() {
276285
},
277286
],
278287
),
288+
(
289+
"Multiple Ranges, Multiple NACKPair",
290+
vec![100, 117, 500, 501, 502],
291+
vec![
292+
NackPair {
293+
packet_id: 100,
294+
lost_packets: 0,
295+
},
296+
NackPair {
297+
packet_id: 117,
298+
lost_packets: 0,
299+
},
300+
NackPair {
301+
packet_id: 500,
302+
lost_packets: 0x3,
303+
},
304+
],
305+
),
306+
(
307+
"Multiple Ranges, Multiple NACKPair (with rollover)",
308+
vec![100, 117, 65535, 0, 1, 99],
309+
vec![
310+
NackPair {
311+
packet_id: 100,
312+
lost_packets: 0,
313+
},
314+
NackPair {
315+
packet_id: 117,
316+
lost_packets: 0,
317+
},
318+
NackPair {
319+
packet_id: 65535,
320+
lost_packets: 0,
321+
},
322+
NackPair {
323+
packet_id: 0,
324+
lost_packets: 1,
325+
},
326+
NackPair {
327+
packet_id: 99,
328+
lost_packets: 1,
329+
},
330+
],
331+
),
279332
];
280333

281334
for (name, seq_numbers, expected) in test {

0 commit comments

Comments
 (0)