pidgin/pidgin

Merged in release-2.x.y (pull request #516)
release-2.x.y
2019-08-02, Gary Kramlich
a8e08676e356
Merged in release-2.x.y (pull request #516)

Release 2.x.y: some other memory leaks and a jingle/rtp proposed modification

Approved-by: Elliott Sales de Andrade
Approved-by: Gary Kramlich
--- 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);
g_value_reset(&tmp);
+#else
+ gst_object_unref(remaining_pad);
#endif
- gst_object_unref(remaining_pad);
}
gst_iterator_free(iter);
--- 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 @@
}
}
+ if (js->sessions) {
+ g_hash_table_remove_all(js->sessions);
+ g_hash_table_unref(js->sessions);
+ js->sessions = NULL;
+ }
+
g_free(js);
gc->proto_data = NULL;
--- 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);
+ g_free(candidate);
}
GType
@@ -192,9 +193,27 @@
static void
jingle_iceudp_finalize (GObject *iceudp)
{
-/* JingleIceUdpPrivate *priv = JINGLE_ICEUDP_GET_PRIVATE(iceudp); */
+ JingleIceUdpPrivate *priv = JINGLE_ICEUDP_GET_PRIVATE(iceudp);
+ GList *iter;
+
purple_debug_info("jingle","jingle_iceudp_finalize\n");
+ iter = priv->local_candidates;
+ while (iter) {
+ JingleIceUdpCandidate *c = iter->data;
+ g_boxed_free(JINGLE_TYPE_ICEUDP_CANDIDATE, c);
+ iter = g_list_delete_link(iter, iter);
+ }
+ iter = priv->remote_candidates;
+ while (iter) {
+ 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),
- generation, id, ip, 0,
+ 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);
g_free(password);
g_free(username);
+ g_free(foundation);
g_free(ip);
g_free(id);
return iceudp_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),
- rawudp_candidate);
+ 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),
+ rawudp_candidate);
+ }
}
return 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),
- iceudp_candidate);
+ 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),
+ iceudp_candidate);
+ }
}
return transport;
} else {
@@ -383,7 +390,7 @@
JINGLE_TYPE_RAWUDP : JINGLE_TYPE_ICEUDP,
0, candidates));
- 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 @@
session);
g_object_unref(session);
- } 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
+ * non-null values.
+ */
+ } 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);
g_object_unref(session);
return media;
@@ -846,6 +860,9 @@
g_free(remote_jid);
g_free(name);
g_object_unref(session);
+ g_object_unref(transport);
+ purple_media_codec_list_free(codecs);
+ purple_media_candidate_list_free(candidates);
break;
}
case JINGLE_SESSION_TERMINATE: {
@@ -875,6 +892,8 @@
g_free(remote_jid);
g_free(name);
g_object_unref(session);
+ g_object_unref(transport);
+ purple_media_candidate_list_free(candidates);
break;
}
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 */
+ goto done;
+ }
+
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);
}
+done:
g_free(data->session_id);
g_free(data->participant);
+ g_object_unref(data->gtkmedia);
g_free(data);
return FALSE;
}
@@ -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;