diff options
author | Kseniia <vasilchukkseniia@gmail.com> | 2016-09-05 18:31:36 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-09-05 22:57:52 +0300 |
commit | 6136ef66d4333cc8cf17eb3b28f3746a0cf9346c (patch) | |
tree | 0c406df8287e50691b041f1f06cf1bbb38d8bbf4 | |
parent | ca855abae1a38c4278f85b93f84bf2b0c6a8a4d9 (diff) | |
download | gstreamer-6136ef66d4333cc8cf17eb3b28f3746a0cf9346c.tar.gz |
rtsp-session: Fix segfault when doing keep-alive after removing the session
If keep-alive happens after removing the session but before finalizing the
stream transport, we would segfault.
https://bugzilla.gnome.org/show_bug.cgi?id=750544
-rw-r--r-- | gst/rtsp-server/rtsp-session.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gst/rtsp-server/rtsp-session.c b/gst/rtsp-server/rtsp-session.c index 10f5648020..8c664e2858 100644 --- a/gst/rtsp-server/rtsp-session.c +++ b/gst/rtsp-server/rtsp-session.c @@ -250,6 +250,26 @@ gst_rtsp_session_manage_media (GstRTSPSession * sess, const gchar * path, return result; } +static void +gst_rtsp_session_unset_transport_keepalive (GstRTSPSessionMedia * sessmedia) +{ + GstRTSPMedia *media; + guint i, n_streams; + + media = gst_rtsp_session_media_get_media (sessmedia); + n_streams = gst_rtsp_media_n_streams (media); + + for (i = 0; i < n_streams; i++) { + GstRTSPStreamTransport *transport = + gst_rtsp_session_media_get_transport (sessmedia, i); + + if (!transport) + continue; + + gst_rtsp_stream_transport_set_keepalive (transport, NULL, NULL, NULL); + } +} + /** * gst_rtsp_session_release_media: * @sess: a #GstRTSPSession @@ -281,6 +301,9 @@ gst_rtsp_session_release_media (GstRTSPSession * sess, more = (priv->medias != NULL); g_mutex_unlock (&priv->lock); + if (find && !more) + gst_rtsp_session_unset_transport_keepalive (media); + if (find) g_object_unref (media); |