Mercurial > pidgin.yaz
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; }