From 1ae701bc0d7997ed31dbb383c77a5f422fcc4a7f Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 12 Dec 2016 13:54:24 +0000 Subject: [PATCH] [Minor] Add some initial workarounds for broken CT --- src/libmime/content_type.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/libmime/content_type.c b/src/libmime/content_type.c index fa9768bf4..934c12eab 100644 --- a/src/libmime/content_type.c +++ b/src/libmime/content_type.c @@ -66,6 +66,7 @@ rspamd_content_type_parse (const gchar *in, gsize len, rspamd_mempool_t *pool) { struct rspamd_content_type *res = NULL, val; + rspamd_ftok_t srch; val.lc_data = rspamd_mempool_alloc (pool, len); memcpy (val.lc_data, in, len); @@ -79,6 +80,40 @@ rspamd_content_type_parse (const gchar *in, rspamd_mempool_add_destructor (pool, (rspamd_mempool_destruct_t)g_hash_table_unref, res->attrs); } + + /* Now do some hacks to work with broken content types */ + if (res->subtype.len == 0) { + srch.begin = "text"; + srch.len = 4; + + if (rspamd_ftok_cmp (&res->type, &srch) == 0) { + /* Workaround for Content-Type: text */ + /* Assume text/plain */ + res->subtype.begin = "plain"; + res->subtype.len = 5; + } + else { + srch.begin = "html"; + srch.len = 4; + + if (rspamd_ftok_cmp (&res->type, &srch) == 0) { + /* Workaround for Content-Type: html */ + res->type.begin = "text"; + res->type.len = 4; + res->subtype.begin = "html"; + res->subtype.len = 4; + } + else { + srch.begin = "application"; + srch.len = 11; + + if (rspamd_ftok_cmp (&res->type, &srch) == 0) { + res->subtype.begin = "octet-stream"; + res->subtype.len = 12; + } + } + } + } } else { msg_warn_pool ("cannot parse content type: %*s", (gint)len, val.lc_data); -- 2.39.5