# HG changeset patch # User jakub.adam@ktknet.cz # Date 1290905075 0 # Node ID 79c438f2cb699093c051a154626520c99c672519 # Parent a42f7d3ad459b5d8644013316cce0e411cc946e9 Correct parsing of multipart messages in purple_mim_document_parse, when the boundary contains a '='. Fixes #11598. committer: Elliott Sales de Andrade diff -r a42f7d3ad459 -r 79c438f2cb69 ChangeLog --- a/ChangeLog Sun Nov 28 00:18:31 2010 +0000 +++ b/ChangeLog Sun Nov 28 00:44:35 2010 +0000 @@ -5,6 +5,10 @@ * Fix the exceptions in purple-remote on Python 2.6+. (Ari Pollak) (#12151) + libpurple: + * Fix multipart parsing when '=' is included in the boundary for + purple_mime_document_parse. (Jakub Adam) (#11598) + Gadu-Gadu: * Updated our bundled libgadu and minimum requirement for external libgadu to 1.9.0. (#12789) diff -r a42f7d3ad459 -r 79c438f2cb69 libpurple/mime.c --- a/libpurple/mime.c Sun Nov 28 00:18:31 2010 +0000 +++ b/libpurple/mime.c Sun Nov 28 00:44:35 2010 +0000 @@ -436,6 +436,34 @@ g_free(bnd); } +#define BOUNDARY "boundary=" +static char * +parse_boundary(const char *ct) +{ + char *boundary_begin = g_strstr_len(ct, -1, BOUNDARY); + char *boundary_end; + + if (!boundary_begin) + return NULL; + + boundary_begin += sizeof(BOUNDARY) - 1; + + if (*boundary_begin == '"') { + boundary_end = strchr(++boundary_begin, '"'); + if (!boundary_end) + return NULL; + } else { + boundary_end = strchr(boundary_begin, ' '); + if (!boundary_end) { + boundary_end = strchr(boundary_begin, ';'); + if (!boundary_end) + boundary_end = boundary_begin + strlen(boundary_begin); + } + } + + return g_strndup(boundary_begin, boundary_end - boundary_begin); +} +#undef BOUNDARY PurpleMimeDocument * purple_mime_document_parsen(const char *buf, gsize len) @@ -456,10 +484,11 @@ { const char *ct = fields_get(&doc->fields, "content-type"); - if(ct && purple_str_has_prefix(ct, "multipart")) { - char *bd = strrchr(ct, '='); - if(bd++) { + if (ct && purple_str_has_prefix(ct, "multipart")) { + char *bd = parse_boundary(ct); + if (bd) { doc_parts_load(doc, bd, b, n); + g_free(bd); } } }