mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-18 05:16:05 +00:00
gst/rtpmanager/: Unset GValues after g_signal_emitv so that we avoid a refcount leak.
Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (get_pt_map), (free_client), (gst_rtp_bin_associate), (gst_rtp_bin_get_free_pad_name): * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_get_clock_rate): * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps): * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate): Unset GValues after g_signal_emitv so that we avoid a refcount leak. Don't leak a padname. Don't leak client streams list. Lock rtpbin when associating streams. Fixes #528245.
This commit is contained in:
parent
720aaac7a4
commit
0fcc94b64e
5 changed files with 41 additions and 5 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
2008-04-17 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/rtpmanager/gstrtpbin.c: (get_pt_map), (free_client),
|
||||||
|
(gst_rtp_bin_associate), (gst_rtp_bin_get_free_pad_name):
|
||||||
|
* gst/rtpmanager/gstrtpjitterbuffer.c:
|
||||||
|
(gst_rtp_jitter_buffer_get_clock_rate):
|
||||||
|
* gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps):
|
||||||
|
* gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate):
|
||||||
|
Unset GValues after g_signal_emitv so that we avoid a refcount leak.
|
||||||
|
Don't leak a padname.
|
||||||
|
Don't leak client streams list.
|
||||||
|
Lock rtpbin when associating streams. Fixes #528245.
|
||||||
|
|
||||||
2008-04-16 Sebastian Dröge <slomo@circular-chaos.org>
|
2008-04-16 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
* tests/check/Makefile.am:
|
* tests/check/Makefile.am:
|
||||||
|
|
|
@ -604,7 +604,11 @@ get_pt_map (GstRtpBinSession * session, guint pt)
|
||||||
|
|
||||||
g_signal_emitv (args, gst_rtp_bin_signals[SIGNAL_REQUEST_PT_MAP], 0, &ret);
|
g_signal_emitv (args, gst_rtp_bin_signals[SIGNAL_REQUEST_PT_MAP], 0, &ret);
|
||||||
|
|
||||||
caps = (GstCaps *) g_value_get_boxed (&ret);
|
g_value_unset (&args[0]);
|
||||||
|
g_value_unset (&args[1]);
|
||||||
|
g_value_unset (&args[2]);
|
||||||
|
caps = (GstCaps *) g_value_dup_boxed (&ret);
|
||||||
|
g_value_unset (&ret);
|
||||||
if (!caps)
|
if (!caps)
|
||||||
goto no_caps;
|
goto no_caps;
|
||||||
|
|
||||||
|
@ -662,6 +666,7 @@ gst_rtp_bin_clear_pt_map (GstRtpBin * bin)
|
||||||
GST_RTP_BIN_UNLOCK (bin);
|
GST_RTP_BIN_UNLOCK (bin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get a client with the given SDES name. Must be called with RTP_BIN_LOCK */
|
||||||
static GstRtpBinClient *
|
static GstRtpBinClient *
|
||||||
get_client (GstRtpBin * bin, guint8 len, guint8 * data, gboolean * created)
|
get_client (GstRtpBin * bin, guint8 len, guint8 * data, gboolean * created)
|
||||||
{
|
{
|
||||||
|
@ -698,6 +703,7 @@ get_client (GstRtpBin * bin, guint8 len, guint8 * data, gboolean * created)
|
||||||
static void
|
static void
|
||||||
free_client (GstRtpBinClient * client)
|
free_client (GstRtpBinClient * client)
|
||||||
{
|
{
|
||||||
|
g_slist_free (client->streams);
|
||||||
g_free (client->cname);
|
g_free (client->cname);
|
||||||
g_free (client);
|
g_free (client);
|
||||||
}
|
}
|
||||||
|
@ -713,6 +719,7 @@ gst_rtp_bin_associate (GstRtpBin * bin, GstRtpBinStream * stream, guint8 len,
|
||||||
GSList *walk;
|
GSList *walk;
|
||||||
|
|
||||||
/* first find or create the CNAME */
|
/* first find or create the CNAME */
|
||||||
|
GST_RTP_BIN_LOCK (bin);
|
||||||
client = get_client (bin, len, data, &created);
|
client = get_client (bin, len, data, &created);
|
||||||
|
|
||||||
/* find stream in the client */
|
/* find stream in the client */
|
||||||
|
@ -830,16 +837,19 @@ gst_rtp_bin_associate (GstRtpBin * bin, GstRtpBinStream * stream, guint8 len,
|
||||||
ostream->ssrc, ostream->ts_offset);
|
ostream->ssrc, ostream->ts_offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GST_RTP_BIN_UNLOCK (bin);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
no_clock_base:
|
no_clock_base:
|
||||||
{
|
{
|
||||||
GST_WARNING_OBJECT (bin, "we have no clock-base");
|
GST_WARNING_OBJECT (bin, "we have no clock-base");
|
||||||
|
GST_RTP_BIN_UNLOCK (bin);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
no_clock_rate:
|
no_clock_rate:
|
||||||
{
|
{
|
||||||
GST_WARNING_OBJECT (bin, "we have no clock-rate");
|
GST_WARNING_OBJECT (bin, "we have no clock-rate");
|
||||||
|
GST_RTP_BIN_UNLOCK (bin);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2165,8 +2175,12 @@ gst_rtp_bin_get_free_pad_name (GstElement * element, GstPadTemplate * templ)
|
||||||
pad_it = gst_element_iterate_pads (GST_ELEMENT (element));
|
pad_it = gst_element_iterate_pads (GST_ELEMENT (element));
|
||||||
name_found = TRUE;
|
name_found = TRUE;
|
||||||
while (gst_iterator_next (pad_it, (gpointer) & pad) == GST_ITERATOR_OK) {
|
while (gst_iterator_next (pad_it, (gpointer) & pad) == GST_ITERATOR_OK) {
|
||||||
if (strcmp (gst_pad_get_name (pad), pad_name) == 0)
|
gchar *name;
|
||||||
|
|
||||||
|
name = gst_pad_get_name (pad);
|
||||||
|
if (strcmp (name, pad_name) == 0)
|
||||||
name_found = FALSE;
|
name_found = FALSE;
|
||||||
|
g_free (name);
|
||||||
}
|
}
|
||||||
gst_iterator_free (pad_it);
|
gst_iterator_free (pad_it);
|
||||||
}
|
}
|
||||||
|
|
|
@ -771,7 +771,10 @@ gst_rtp_jitter_buffer_get_clock_rate (GstRtpJitterBuffer * jitterbuffer,
|
||||||
g_signal_emitv (args, gst_rtp_jitter_buffer_signals[SIGNAL_REQUEST_PT_MAP], 0,
|
g_signal_emitv (args, gst_rtp_jitter_buffer_signals[SIGNAL_REQUEST_PT_MAP], 0,
|
||||||
&ret);
|
&ret);
|
||||||
|
|
||||||
caps = (GstCaps *) g_value_get_boxed (&ret);
|
g_value_unset (&args[0]);
|
||||||
|
g_value_unset (&args[1]);
|
||||||
|
caps = (GstCaps *) g_value_dup_boxed (&ret);
|
||||||
|
g_value_unset (&ret);
|
||||||
if (!caps)
|
if (!caps)
|
||||||
goto no_caps;
|
goto no_caps;
|
||||||
|
|
||||||
|
|
|
@ -273,7 +273,10 @@ gst_rtp_pt_demux_get_caps (GstRtpPtDemux * rtpdemux, guint pt)
|
||||||
g_signal_emitv (args, gst_rtp_pt_demux_signals[SIGNAL_REQUEST_PT_MAP], 0,
|
g_signal_emitv (args, gst_rtp_pt_demux_signals[SIGNAL_REQUEST_PT_MAP], 0,
|
||||||
&ret);
|
&ret);
|
||||||
|
|
||||||
caps = g_value_get_boxed (&ret);
|
g_value_unset (&args[0]);
|
||||||
|
g_value_unset (&args[1]);
|
||||||
|
caps = g_value_dup_boxed (&ret);
|
||||||
|
g_value_unset (&ret);
|
||||||
if (caps == NULL)
|
if (caps == NULL)
|
||||||
caps = GST_PAD_CAPS (rtpdemux->sink);
|
caps = GST_PAD_CAPS (rtpdemux->sink);
|
||||||
|
|
||||||
|
|
|
@ -1244,7 +1244,10 @@ gst_rtp_session_clock_rate (RTPSession * sess, guint8 payload,
|
||||||
g_signal_emitv (args, gst_rtp_session_signals[SIGNAL_REQUEST_PT_MAP], 0,
|
g_signal_emitv (args, gst_rtp_session_signals[SIGNAL_REQUEST_PT_MAP], 0,
|
||||||
&ret);
|
&ret);
|
||||||
|
|
||||||
caps = (GstCaps *) g_value_get_boxed (&ret);
|
g_value_unset (&args[0]);
|
||||||
|
g_value_unset (&args[1]);
|
||||||
|
caps = (GstCaps *) g_value_dup_boxed (&ret);
|
||||||
|
g_value_unset (&ret);
|
||||||
if (!caps)
|
if (!caps)
|
||||||
goto no_caps;
|
goto no_caps;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue