mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 23:06:49 +00:00
adaptivedemux2: Fix memory leaks and use-after-free
Fix various small memory leaks, and an invalid access to GstEvent after giving away the ref via gst_pad_push_event() Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2676>
This commit is contained in:
parent
4b7622b377
commit
63d3ba4dfb
2 changed files with 14 additions and 4 deletions
|
@ -1163,6 +1163,9 @@ gst_adaptive_demux_handle_upstream_http_header (GQuark field_id,
|
||||||
g_free (date_string);
|
g_free (date_string);
|
||||||
|
|
||||||
gst_adaptive_demux_clock_set_utc_time (demux->realtime_clock, utc_now);
|
gst_adaptive_demux_clock_set_utc_time (demux->realtime_clock, utc_now);
|
||||||
|
|
||||||
|
g_date_time_unref (utc_now);
|
||||||
|
gst_date_time_unref (datetime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3669,10 +3672,11 @@ restart:
|
||||||
GstEvent *event = (GstEvent *) mo;
|
GstEvent *event = (GstEvent *) mo;
|
||||||
if (GST_EVENT_TYPE (event) == GST_EVENT_GAP)
|
if (GST_EVENT_TYPE (event) == GST_EVENT_GAP)
|
||||||
slot->pushed_timed_data = TRUE;
|
slot->pushed_timed_data = TRUE;
|
||||||
gst_pad_push_event (slot->pad, event);
|
gst_pad_push_event (slot->pad, gst_event_ref (event));
|
||||||
|
|
||||||
if (GST_EVENT_IS_STICKY (event))
|
if (GST_EVENT_IS_STICKY (event))
|
||||||
gst_event_store_mark_delivered (&track->sticky_events, event);
|
gst_event_store_mark_delivered (&track->sticky_events, event);
|
||||||
|
gst_event_unref (event);
|
||||||
} else if (GST_IS_BUFFER (mo)) {
|
} else if (GST_IS_BUFFER (mo)) {
|
||||||
GstBuffer *buffer = (GstBuffer *) mo;
|
GstBuffer *buffer = (GstBuffer *) mo;
|
||||||
|
|
||||||
|
|
|
@ -229,7 +229,7 @@ void
|
||||||
gst_adaptive_demux_loop_start (GstAdaptiveDemuxLoop * loop)
|
gst_adaptive_demux_loop_start (GstAdaptiveDemuxLoop * loop)
|
||||||
{
|
{
|
||||||
g_mutex_lock (&loop->lock);
|
g_mutex_lock (&loop->lock);
|
||||||
if (loop->thread != NULL && !loop->stopped)
|
if (loop->thread != NULL)
|
||||||
goto done; /* Already running */
|
goto done; /* Already running */
|
||||||
|
|
||||||
loop->stopped = FALSE;
|
loop->stopped = FALSE;
|
||||||
|
@ -255,9 +255,10 @@ void
|
||||||
gst_adaptive_demux_loop_stop (GstAdaptiveDemuxLoop * loop, gboolean wait)
|
gst_adaptive_demux_loop_stop (GstAdaptiveDemuxLoop * loop, gboolean wait)
|
||||||
{
|
{
|
||||||
g_mutex_lock (&loop->lock);
|
g_mutex_lock (&loop->lock);
|
||||||
loop->stopped = TRUE;
|
|
||||||
|
|
||||||
if (loop->loop != NULL) {
|
if (!loop->stopped) {
|
||||||
|
loop->stopped = TRUE;
|
||||||
|
|
||||||
GSource *s = g_idle_source_new ();
|
GSource *s = g_idle_source_new ();
|
||||||
g_source_set_callback (s, (GSourceFunc) do_quit_cb,
|
g_source_set_callback (s, (GSourceFunc) do_quit_cb,
|
||||||
gst_adaptive_demux_loop_ref (loop),
|
gst_adaptive_demux_loop_ref (loop),
|
||||||
|
@ -269,6 +270,11 @@ gst_adaptive_demux_loop_stop (GstAdaptiveDemuxLoop * loop, gboolean wait)
|
||||||
while (loop->loop != NULL)
|
while (loop->loop != NULL)
|
||||||
g_cond_wait (&loop->cond, &loop->lock);
|
g_cond_wait (&loop->cond, &loop->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (loop->thread != NULL) {
|
||||||
|
g_thread_unref (loop->thread);
|
||||||
|
loop->thread = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_mutex_unlock (&loop->lock);
|
g_mutex_unlock (&loop->lock);
|
||||||
|
|
Loading…
Reference in a new issue