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

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