# HG changeset patch # User Paul Aurich # Date 1251749196 0 # Node ID 7f447db0e03bbf6efec5c17d4d97d13f15f31707 # Parent 10c28fac798dd7ab9fad7bd92aa710566b091876 jabber: Stricter parsing of a BoB data stanza diff -r 10c28fac798d -r 7f447db0e03b libpurple/protocols/jabber/data.c --- a/libpurple/protocols/jabber/data.c Mon Aug 31 08:00:06 2009 +0000 +++ b/libpurple/protocols/jabber/data.c Mon Aug 31 20:06:36 2009 +0000 @@ -56,31 +56,42 @@ 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; + + /* check if this is a "data" tag */ + if (strcmp(tag->name, "data") != 0) { + purple_debug_error("jabber", "Invalid data element\n"); + return NULL; + } + + cid = xmlnode_get_attrib(tag, "cid"); + type = xmlnode_get_attrib(tag, "type"); - if (data == NULL) { - purple_debug_error("jabber", "Could not allocate data object\n"); + if (!cid || !type) { + purple_debug_error("jabber", "cid or type missing\n"); + return NULL; + } + + raw_data = xmlnode_get_data(tag); + 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); + + if (data->data == NULL) { + purple_debug_error("jabber", "Malformed base64 data\n"); g_free(data); 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); - 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); - data->data = purple_base64_decode(raw_data, &size); - data->size = size; - - g_free(raw_data); + data->cid = g_strdup(cid); + data->type = g_strdup(type); return data; }