Blame SOURCES/pidgin-2.10.11-jabber-Avoid-a-use-after-free-in-an-error-path.patch

89ed29
From 6cb247f13fb773baea64b5efaf08984b5368cc4a Mon Sep 17 00:00:00 2001
89ed29
From: Debarshi Ray <rishi@gnu.org>
89ed29
Date: Wed, 26 Apr 2017 19:54:42 +0200
89ed29
Subject: [PATCH] jabber: Avoid a use-after-free in an error path
89ed29
89ed29
If jabber_buddy_find_resource returned NULL, 'resource' was being used
89ed29
to print an error after it had already been freed. The easiest way to
89ed29
prevent that is to consolidate all the local resource deallocation and
89ed29
exit paths in one place.
89ed29
89ed29
Fixes #17200
89ed29
---
89ed29
 libpurple/protocols/jabber/jingle/rtp.c | 21 ++++++++++++---------
89ed29
 1 file changed, 12 insertions(+), 9 deletions(-)
89ed29
89ed29
diff --git a/libpurple/protocols/jabber/jingle/rtp.c b/libpurple/protocols/jabber/jingle/rtp.c
89ed29
index 57783abe413d..38d536c342ba 100644
89ed29
--- a/libpurple/protocols/jabber/jingle/rtp.c
89ed29
+++ b/libpurple/protocols/jabber/jingle/rtp.c
89ed29
@@ -950,6 +950,7 @@ jingle_rtp_initiate_media(JabberStream *js, const gchar *who,
89ed29
 	JingleTransport *transport;
89ed29
 	JabberBuddy *jb;
89ed29
 	JabberBuddyResource *jbr;
89ed29
+	gboolean ret = FALSE;
89ed29
 	const gchar *transport_type;
89ed29
 
89ed29
 	gchar *resource = NULL, *me = NULL, *sid = NULL;
89ed29
@@ -958,16 +959,15 @@ jingle_rtp_initiate_media(JabberStream *js, const gchar *who,
89ed29
 	jb = jabber_buddy_find(js, who, FALSE);
89ed29
 	if (!jb) {
89ed29
 		purple_debug_error("jingle-rtp", "Could not find Jabber buddy\n");
89ed29
-		return FALSE;
89ed29
+		goto out;
89ed29
 	}
89ed29
 
89ed29
 	resource = jabber_get_resource(who);
89ed29
 	jbr = jabber_buddy_find_resource(jb, resource);
89ed29
-	g_free(resource);
89ed29
 
89ed29
 	if (!jbr) {
89ed29
 		purple_debug_error("jingle-rtp", "Could not find buddy's resource - %s\n", resource);
89ed29
-		return FALSE;
89ed29
+		goto out;
89ed29
 	}
89ed29
 
89ed29
 	if (jabber_resource_has_capability(jbr, JINGLE_TRANSPORT_ICEUDP)) {
89ed29
@@ -977,7 +977,7 @@ jingle_rtp_initiate_media(JabberStream *js, const gchar *who,
89ed29
 	} else {
89ed29
 		purple_debug_error("jingle-rtp", "Resource doesn't support "
89ed29
 				"the same transport types\n");
89ed29
-		return FALSE;
89ed29
+		goto out;
89ed29
 	}
89ed29
 
89ed29
 	/* set ourselves as initiator */
89ed29
@@ -985,7 +985,6 @@ jingle_rtp_initiate_media(JabberStream *js, const gchar *who,
89ed29
 
89ed29
 	sid = jabber_get_next_id(js);
89ed29
 	session = jingle_session_create(js, sid, me, who, TRUE);
89ed29
-	g_free(sid);
89ed29
 
89ed29
 
89ed29
 	if (type & PURPLE_MEDIA_AUDIO) {
89ed29
@@ -1005,13 +1004,17 @@ jingle_rtp_initiate_media(JabberStream *js, const gchar *who,
89ed29
 		jingle_rtp_init_media(content);
89ed29
 	}
89ed29
 
89ed29
-	g_free(me);
89ed29
-
89ed29
 	if (jingle_rtp_get_media(session) == NULL) {
89ed29
-		return FALSE;
89ed29
+		goto out;
89ed29
 	}
89ed29
 
89ed29
-	return TRUE;
89ed29
+	ret = TRUE;
89ed29
+
89ed29
+out:
89ed29
+	g_free(me);
89ed29
+	g_free(resource);
89ed29
+	g_free(sid);
89ed29
+	return ret;
89ed29
 }
89ed29
 
89ed29
 void
89ed29
-- 
89ed29
2.9.3
89ed29