|
|
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 |
|