summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <bilboed@bilboed.com>2016-12-01 17:08:09 +0100
committerSebastian Dröge <sebastian@centricular.com>2016-12-05 12:31:49 +0200
commit5f4a894887039a4166f3519d55a3ae101cdc07c2 (patch)
tree3fe07f89c759515ae976d18e5f9acb34ee500353
parent6907ba949c3fc2a264b5779f76ac8a283e6a51b7 (diff)
downloadgstreamer-plugins-good-5f4a894887039a4166f3519d55a3ae101cdc07c2.tar.gz
jitterbuffer: Don't leak duplicate items
When providing items with a seqnum, there is a (very small) probability that an element with the same seqnum already exists. Don't forget to free that item if it wasn't inserted. And avoid returning undefined values when dealing with duplicate items
-rw-r--r--gst/rtpmanager/gstrtpjitterbuffer.c4
-rw-r--r--gst/rtpmanager/rtpjitterbuffer.c2
2 files changed, 5 insertions, 1 deletions
diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c
index a6e0b3af8..2ca9fe742 100644
--- a/gst/rtpmanager/gstrtpjitterbuffer.c
+++ b/gst/rtpmanager/gstrtpjitterbuffer.c
@@ -3757,7 +3757,9 @@ do_lost_timeout (GstRtpJitterBuffer * jitterbuffer, TimerData * timer,
"retry", G_TYPE_UINT, num_rtx_retry, NULL));
}
item = alloc_item (event, ITEM_TYPE_LOST, -1, -1, seqnum, lost_packets, -1);
- rtp_jitter_buffer_insert (priv->jbuf, item, &head, NULL);
+ if (!rtp_jitter_buffer_insert (priv->jbuf, item, &head, NULL))
+ /* Duplicate */
+ free_item (item);
if (GST_CLOCK_TIME_IS_VALID (timer->rtx_last)) {
/* Store info to update stats if the packet arrives too late */
diff --git a/gst/rtpmanager/rtpjitterbuffer.c b/gst/rtpmanager/rtpjitterbuffer.c
index c31c8e64b..03b7ebc1e 100644
--- a/gst/rtpmanager/rtpjitterbuffer.c
+++ b/gst/rtpmanager/rtpjitterbuffer.c
@@ -1034,6 +1034,8 @@ append:
duplicate:
{
GST_DEBUG ("duplicate packet %d found", (gint) seqnum);
+ if (G_LIKELY (head))
+ *head = FALSE;
return FALSE;
}
}