summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKseniia <vasilchukkseniia@gmail.com>2016-09-05 18:31:36 +0300
committerSebastian Dröge <sebastian@centricular.com>2016-09-05 22:57:52 +0300
commit6136ef66d4333cc8cf17eb3b28f3746a0cf9346c (patch)
tree0c406df8287e50691b041f1f06cf1bbb38d8bbf4
parentca855abae1a38c4278f85b93f84bf2b0c6a8a4d9 (diff)
downloadgstreamer-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.c23
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);