changeset 28516:087ad09cd4f5

merge of '5fabe3309f53afaf46157b615ec20eec581969e5' and 'fd5955618eddcd84d522b30ff11102f9601f38c8'
author Paul Aurich <paul@darkrain42.org>
date Mon, 31 Aug 2009 20:10:35 +0000
parents 02c62c9ad822 (diff) 191bb5bf2fc5 (current diff)
children 40d8427d1813 196e4c5b2043
files libpurple/protocols/jabber/data.c
diffstat 1 files changed, 27 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/protocols/jabber/data.c	Mon Aug 31 20:07:34 2009 +0000
+++ b/libpurple/protocols/jabber/data.c	Mon Aug 31 20:10:35 2009 +0000
@@ -56,26 +56,24 @@
 JabberData *
 jabber_data_create_from_xml(xmlnode *tag)
 {
-	JabberData *data = g_new0(JabberData, 1);
-	gsize size;
-	gpointer raw_data = NULL;
+	JabberData *data;
+	gchar *raw_data = NULL;
+	const gchar *cid, *type;
 
-	if (data == NULL) {
-		purple_debug_error("jabber", "Could not allocate data object\n");
-		g_free(data);
+	/* check if this is a "data" tag */
+	if (strcmp(tag->name, "data") != 0) {
+		purple_debug_error("jabber", "Invalid data element\n");
 		return NULL;
 	}
 
-	/* check if this is a "data" tag */
-	if (strcmp(tag->name, "data") != 0) {
-		purple_debug_error("jabber", "Invalid data element");
-		g_free(data);
+	cid = xmlnode_get_attrib(tag, "cid");
+	type = xmlnode_get_attrib(tag, "type");
+
+	if (!cid || !type) {
+		purple_debug_error("jabber", "cid or type missing\n");
 		return NULL;
 	}
 
-	data->cid = g_strdup(xmlnode_get_attrib(tag, "cid"));
-	data->type = g_strdup(xmlnode_get_attrib(tag, "type"));
-
 	raw_data = xmlnode_get_data(tag);
 
 	if (raw_data == NULL) {
@@ -84,10 +82,23 @@
 		return NULL;
 	}
 
-	data->data = purple_base64_decode(raw_data, &size);
-	data->size = size;
+	if (raw_data == NULL || *raw_data == '\0') {
+		g_free(raw_data);
+		return NULL;
+	}
+
+	data = g_new0(JabberData, 1);
+	data->data = purple_base64_decode(raw_data, &data->size);
+	g_free(raw_data);
 
-	g_free(raw_data);
+	if (data->data == NULL) {
+		purple_debug_error("jabber", "Malformed base64 data\n");
+		g_free(data);
+		return NULL;
+	}
+
+	data->cid = g_strdup(cid);
+	data->type = g_strdup(type);
 
 	return data;
 }