--- a/libpurple/media/backend-fs2.c Sat Jul 27 03:23:16 2019 +0000
+++ b/libpurple/media/backend-fs2.c Fri Aug 02 23:56:19 2019 +0000
@@ -1896,6 +1896,7 @@
gst_element_set_locked_state(session->src, FALSE);
gst_object_unref(session->src);
gst_object_unref(sinkpad);
+ gst_object_unref(srcpad); purple_media_manager_create_output_window(purple_media_get_manager(
priv->media), priv->media, sess_id, NULL);
--- a/libpurple/mediamanager.c Sat Jul 27 03:23:16 2019 +0000
+++ b/libpurple/mediamanager.c Fri Aug 02 23:56:19 2019 +0000
@@ -737,8 +737,9 @@
#if GST_CHECK_VERSION(1,0,0)
remaining_pad = g_value_get_object(&tmp);
+ gst_object_unref(remaining_pad); - gst_object_unref(remaining_pad);
--- a/libpurple/protocols/jabber/jabber.c Sat Jul 27 03:23:16 2019 +0000
+++ b/libpurple/protocols/jabber/jabber.c Fri Aug 02 23:56:19 2019 +0000
@@ -1765,6 +1765,12 @@
+ g_hash_table_remove_all(js->sessions); + g_hash_table_unref(js->sessions); --- a/libpurple/protocols/jabber/jingle/iceudp.c Sat Jul 27 03:23:16 2019 +0000
+++ b/libpurple/protocols/jabber/jingle/iceudp.c Fri Aug 02 23:56:19 2019 +0000
@@ -89,6 +89,7 @@
g_free(candidate->username);
g_free(candidate->password);
@@ -192,9 +193,27 @@
jingle_iceudp_finalize (GObject *iceudp)
-/* JingleIceUdpPrivate *priv = JINGLE_ICEUDP_GET_PRIVATE(iceudp); */
+ JingleIceUdpPrivate *priv = JINGLE_ICEUDP_GET_PRIVATE(iceudp); purple_debug_info("jingle","jingle_iceudp_finalize\n");
+ iter = priv->local_candidates; + JingleIceUdpCandidate *c = iter->data; + g_boxed_free(JINGLE_TYPE_ICEUDP_CANDIDATE, c); + iter = g_list_delete_link(iter, iter); + iter = priv->remote_candidates; + JingleIceUdpCandidate *c = iter->data; + g_boxed_free(JINGLE_TYPE_ICEUDP_CANDIDATE, c); + iter = g_list_delete_link(iter, iter); + priv->local_candidates = NULL; + priv->remote_candidates = NULL; G_OBJECT_CLASS(parent_class)->finalize(iceudp);
--- a/libpurple/protocols/jabber/jingle/rtp.c Sat Jul 27 03:23:16 2019 +0000
+++ b/libpurple/protocols/jabber/jingle/rtp.c Fri Aug 02 23:56:19 2019 +0000
@@ -251,11 +251,11 @@
gchar *password = purple_media_candidate_get_password(candidate);
PurpleMediaCandidateType type =
purple_media_candidate_get_candidate_type(candidate);
+ gchar *foundation = purple_media_candidate_get_foundation(candidate); JingleIceUdpCandidate *iceudp_candidate = jingle_iceudp_candidate_new(
purple_media_candidate_get_component_id(candidate),
- purple_media_candidate_get_foundation(candidate),
+ foundation, generation, id, ip, 0, purple_media_candidate_get_port(candidate),
purple_media_candidate_get_priority(candidate), "udp",
type == PURPLE_MEDIA_CANDIDATE_TYPE_HOST ? "host" :
@@ -269,6 +269,7 @@
purple_media_candidate_get_base_port(candidate);
@@ -282,11 +283,14 @@
JingleRawUdpCandidate *rawudp_candidate;
for (; candidates; candidates = g_list_next(candidates)) {
PurpleMediaCandidate *candidate = candidates->data;
- rawudp_candidate = jingle_rtp_candidate_to_rawudp(
- session, generation, candidate);
- jingle_rawudp_add_local_candidate(
- JINGLE_RAWUDP(transport),
+ if (purple_media_candidate_get_protocol(candidate) == + PURPLE_MEDIA_NETWORK_PROTOCOL_UDP) { + rawudp_candidate = jingle_rtp_candidate_to_rawudp( + session, generation, candidate); + jingle_rawudp_add_local_candidate( + JINGLE_RAWUDP(transport), } else if (type == JINGLE_TYPE_ICEUDP) {
@@ -294,11 +298,14 @@
JingleIceUdpCandidate *iceudp_candidate;
for (; candidates; candidates = g_list_next(candidates)) {
PurpleMediaCandidate *candidate = candidates->data;
- iceudp_candidate = jingle_rtp_candidate_to_iceudp(
- session, generation, candidate);
- jingle_iceudp_add_local_candidate(
- JINGLE_ICEUDP(transport),
+ if (purple_media_candidate_get_protocol(candidate) == + PURPLE_MEDIA_NETWORK_PROTOCOL_UDP) { + iceudp_candidate = jingle_rtp_candidate_to_iceudp( + session, generation, candidate); + jingle_iceudp_add_local_candidate( + JINGLE_ICEUDP(transport), @@ -383,7 +390,7 @@
JINGLE_TYPE_RAWUDP : JINGLE_TYPE_ICEUDP,
- g_list_free(candidates);
+ purple_media_candidate_list_free(candidates); g_object_unref(oldtransport);
jingle_content_set_pending_transport(content, transport);
@@ -485,8 +492,15 @@
- } else if (type == PURPLE_MEDIA_INFO_ACCEPT &&
+ /* The same signal is emited *four* times in case of acceptance + * by purple_media_stream_info() (stream acceptance, session + * acceptance, participant acceptance, and conference acceptance). + * We only react to the first one, where sid and name are given + } else if (type == PURPLE_MEDIA_INFO_ACCEPT && sid && name && jingle_session_is_initiator(session) == FALSE) {
jingle_rtp_ready(session);
@@ -551,8 +565,8 @@
G_CALLBACK(jingle_rtp_codecs_changed_cb), session);
g_signal_connect(G_OBJECT(media), "state-changed",
G_CALLBACK(jingle_rtp_state_changed_cb), session);
- g_signal_connect(G_OBJECT(media), "stream-info",
- G_CALLBACK(jingle_rtp_stream_info_cb), session);
+ g_signal_connect_object(G_OBJECT(media), "stream-info", + G_CALLBACK(jingle_rtp_stream_info_cb), session, 0); @@ -846,6 +860,9 @@
+ g_object_unref(transport); + purple_media_codec_list_free(codecs); + purple_media_candidate_list_free(candidates); case JINGLE_SESSION_TERMINATE: {
@@ -875,6 +892,8 @@
+ g_object_unref(transport); + purple_media_candidate_list_free(candidates); case JINGLE_DESCRIPTION_INFO: {
--- a/pidgin/gtkmedia.c Sat Jul 27 03:23:16 2019 +0000
+++ b/pidgin/gtkmedia.c Fri Aug 02 23:56:19 2019 +0000
@@ -551,6 +551,11 @@
PidginMediaPrivate *priv = data->gtkmedia->priv;
GdkWindow *window = NULL;
+ if (priv->media == NULL) { + /* gtkmedia has been disposed */ if (data->participant == NULL)
#if GTK_CHECK_VERSION(2, 14, 0)
window = gtk_widget_get_window(priv->local_video);
@@ -582,8 +587,10 @@
data->participant, window_id);
g_free(data->session_id);
g_free(data->participant);
+ g_object_unref(data->gtkmedia); @@ -960,7 +967,7 @@
gtk_box_pack_start(GTK_BOX(recv_widget), aspect, TRUE, TRUE, 0);
data = g_new0(PidginMediaRealizeData, 1);
- data->gtkmedia = gtkmedia;
+ data->gtkmedia = g_object_ref(gtkmedia); data->session_id = g_strdup(sid);
data->participant = g_strdup(gtkmedia->priv->screenname);
@@ -991,7 +998,7 @@
gtk_box_pack_start(GTK_BOX(send_widget), aspect, FALSE, TRUE, 0);
data = g_new0(PidginMediaRealizeData, 1);
- data->gtkmedia = gtkmedia;
+ data->gtkmedia = g_object_ref(gtkmedia); data->session_id = g_strdup(sid);
data->participant = NULL;