From de3d0c4522fb4b29887f43c2f274c27b1d0d2209 Mon Sep 17 00:00:00 2001 From: Nikita Bobkov Date: Fri, 25 Sep 2015 15:04:00 +0000 Subject: [PATCH] rtsp-client: Fix leaking of media in error cases With additional fixes by Kseniya Vasilchuk and myself to make the media refcounting a bit easier to follow. https://bugzilla.gnome.org/show_bug.cgi?id=755632 --- gst/rtsp-server/rtsp-client.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/gst/rtsp-server/rtsp-client.c b/gst/rtsp-server/rtsp-client.c index 1f53d67..7af7701 100644 --- a/gst/rtsp-server/rtsp-client.c +++ b/gst/rtsp-server/rtsp-client.c @@ -1965,15 +1965,14 @@ handle_setup_request (GstRTSPClient * client, GstRTSPContext * ctx) if (sessmedia == NULL) { /* manage the media in our session now, if not done already */ - sessmedia = gst_rtsp_session_manage_media (session, path, media); + sessmedia = + gst_rtsp_session_manage_media (session, path, g_object_ref (media)); /* if we stil have no media, error */ if (sessmedia == NULL) goto sessmedia_unavailable; /* don't cache media anymore */ clean_cached_media (client, FALSE); - } else { - g_object_unref (media); } ctx->sessmedia = sessmedia; @@ -2036,6 +2035,7 @@ handle_setup_request (GstRTSPClient * client, GstRTSPContext * ctx) gst_rtsp_session_media_set_rtsp_state (sessmedia, GST_RTSP_STATE_READY); break; } + g_object_unref (media); g_object_unref (session); g_free (path); @@ -2100,12 +2100,12 @@ sessmedia_unavailable: { GST_ERROR ("client %p: can't create session media", client); send_generic_response (client, GST_RTSP_STS_SERVICE_UNAVAILABLE, ctx); - g_object_unref (media); - goto cleanup_session; + goto cleanup_transport; } configure_media_failed_no_reply: { GST_ERROR ("client %p: configure_media failed", client); + g_object_unref (media); /* error reply is already sent */ goto cleanup_session; } @@ -2141,6 +2141,8 @@ keymgmt_error: { cleanup_transport: gst_rtsp_transport_free (ct); + if (media) + g_object_unref (media); cleanup_session: if (new_session) gst_rtsp_session_pool_remove (priv->session_pool, session); -- 2.7.4