From 76ccafbbd088165b7e92f232620d58681f264a56 Mon Sep 17 00:00:00 2001 From: Colin Leroy Date: Sat, 7 Mar 2009 09:46:05 +0000 Subject: [PATCH] 2009-03-07 [colin] 3.7.1cvs3 * src/messageview.c * src/procmime.c * src/procmime.h Handle mimeparts that lack an end boundary. They're invalid but it's too annoying for normal users to fix. --- ChangeLog | 9 +++++++++ PATCHSETS | 1 + configure.ac | 2 +- src/messageview.c | 36 +++++++++++++++++++++++++++++++++++- src/procmime.c | 24 ++++++++++++++++++++++++ src/procmime.h | 2 ++ 6 files changed, 72 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 262ba8855..6cf22f9cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-03-07 [colin] 3.7.1cvs3 + + * src/messageview.c + * src/procmime.c + * src/procmime.h + Handle mimeparts that lack an end boundary. + They're invalid but it's too annoying for + normal users to fix. + 2009-03-06 [wwp] 3.7.1cvs2 * src/compose.c diff --git a/PATCHSETS b/PATCHSETS index c6527d384..9b7a8e8fa 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -3742,3 +3742,4 @@ ( cvs diff -u -r 1.9.2.14 -r 1.9.2.15 po/cs.po; cvs diff -u -r 1.58.2.42 -r 1.58.2.43 po/de.po; cvs diff -u -r 1.1.2.21 -r 1.1.2.22 po/fi.po; cvs diff -u -r 1.42.2.45 -r 1.42.2.46 po/fr.po; cvs diff -u -r 1.5.2.12 -r 1.5.2.13 po/hu.po; cvs diff -u -r 1.28.2.12 -r 1.28.2.13 po/nl.po; cvs diff -u -r 1.50.2.34 -r 1.50.2.35 po/pt_BR.po; cvs diff -u -r 1.4.2.10 -r 1.4.2.11 po/sv.po; cvs diff -u -r 1.5.2.28 -r 1.5.2.29 po/zh_CN.po; ) > 3.7.0cvs78.patchset ( cvs diff -u -r 1.1.2.14 -r 1.1.2.15 src/gedit-print.c; cvs diff -u -r 1.1.2.12 -r 1.1.2.13 src/gtk/gtksourceprintjob.c; ) > 3.7.1cvs1.patchset ( cvs diff -u -r 1.487 -r 1.488 src/compose.c; cvs diff -u -r 1.10 -r 1.11 src/folder_item_prefs.c; cvs diff -u -r 1.6 -r 1.7 src/folder_item_prefs.h; cvs diff -u -r 1.65 -r 1.66 src/prefs_folder_item.c; ) > 3.7.1cvs2.patchset +( cvs diff -u -r 1.94.2.200 -r 1.94.2.201 src/messageview.c; cvs diff -u -r 1.49.2.127 -r 1.49.2.128 src/procmime.c; cvs diff -u -r 1.17.2.23 -r 1.17.2.24 src/procmime.h; ) > 3.7.1cvs3.patchset diff --git a/configure.ac b/configure.ac index 662e5d93a..08f7bc17a 100644 --- a/configure.ac +++ b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=7 MICRO_VERSION=1 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=2 +EXTRA_VERSION=3 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/messageview.c b/src/messageview.c index 4e019e230..fbeed65a7 100644 --- a/src/messageview.c +++ b/src/messageview.c @@ -1107,12 +1107,35 @@ static MimeInfo *find_encrypted_part(MimeInfo *rootinfo) return encinfo; } +static gboolean find_broken_func(GNode *node, gpointer data) +{ + MimeInfo *mimeinfo = (MimeInfo *) node->data; + MimeInfo **brokeninfo = (MimeInfo **) data; + + if (mimeinfo->broken) { + *brokeninfo = mimeinfo; + return TRUE; + } + + return FALSE; +} + +static MimeInfo *find_broken_part(MimeInfo *rootinfo) +{ + MimeInfo *brokeninfo = NULL; + + g_node_traverse(rootinfo->node, G_IN_ORDER, G_TRAVERSE_ALL, -1, + find_broken_func, &brokeninfo); + + return brokeninfo; +} + gint messageview_show(MessageView *messageview, MsgInfo *msginfo, gboolean all_headers) { gchar *text = NULL; gchar *file; - MimeInfo *mimeinfo, *encinfo; + MimeInfo *mimeinfo, *encinfo, *brokeninfo; gchar *subject = NULL; cm_return_val_if_fail(msginfo != NULL, -1); @@ -1203,6 +1226,17 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo, } } + while ((brokeninfo = find_broken_part(mimeinfo)) != NULL) { + noticeview_show(messageview->noticeview); + noticeview_set_icon(messageview->noticeview, + STOCK_PIXMAP_NOTICE_WARN); + noticeview_set_text(messageview->noticeview, _("Message doesn't conform to MIME standard. " + "It may render wrongly.")); + gtk_widget_hide(messageview->noticeview->button); + gtk_widget_hide(messageview->noticeview->button2); + break; + } + if (messageview->msginfo != msginfo) { procmsg_msginfo_free(messageview->msginfo); messageview->msginfo = NULL; diff --git a/src/procmime.c b/src/procmime.c index f58528e93..18497ab04 100644 --- a/src/procmime.c +++ b/src/procmime.c @@ -1543,6 +1543,8 @@ static void procmime_parse_multipart(MimeInfo *mimeinfo, gboolean short_scan) FILE *fp; int result = 0; gboolean done = FALSE; + gboolean start_found = FALSE; + gboolean end_found = FALSE; boundary = g_hash_table_lookup(mimeinfo->typeparameters, "boundary"); if (!boundary) @@ -1556,12 +1558,15 @@ static void procmime_parse_multipart(MimeInfo *mimeinfo, gboolean short_scan) FILE_OP_ERROR(mimeinfo->data.filename, "fopen"); return; } + fseek(fp, mimeinfo->offset, SEEK_SET); while ((p = fgets(buf, sizeof(buf), fp)) != NULL && result == 0) { if (ftell(fp) - 1 > (mimeinfo->offset + mimeinfo->length)) break; if (IS_BOUNDARY(buf, boundary, boundary_len)) { + start_found = TRUE; + if (lastoffset != -1) { gint len = (ftell(fp) - strlen(buf)) - lastoffset - 1; if (len < 0) @@ -1581,6 +1586,7 @@ static void procmime_parse_multipart(MimeInfo *mimeinfo, gboolean short_scan) if (buf[2 + boundary_len] == '-' && buf[2 + boundary_len + 1] == '-') { + end_found = TRUE; break; } for (i = 0; i < (sizeof hentry / sizeof hentry[0]) ; i++) { @@ -1591,6 +1597,22 @@ static void procmime_parse_multipart(MimeInfo *mimeinfo, gboolean short_scan) lastoffset = ftell(fp); } } + + if (start_found && !end_found && lastoffset != -1) { + gint len = (ftell(fp) - strlen(buf)) - lastoffset - 1; + + if (len >= 0) { + result = procmime_parse_mimepart(mimeinfo, + hentry[0].body, hentry[1].body, + hentry[2].body, hentry[3].body, + hentry[4].body, hentry[5].body, + hentry[6].body, hentry[7].body, + mimeinfo->data.filename, lastoffset, + len, short_scan); + } + mimeinfo->broken = TRUE; + } + for (i = 0; i < (sizeof hentry / sizeof hentry[0]); i++) { g_free(hentry[i].body); hentry[i].body = NULL; @@ -1896,6 +1918,8 @@ static int procmime_parse_mimepart(MimeInfo *parent, /* Create MimeInfo */ mimeinfo = procmime_mimeinfo_new(); mimeinfo->content = MIMECONTENT_FILE; + mimeinfo->lax_parse = parent->lax_parse; + if (parent != NULL) { if (g_node_depth(parent->node) > 32) { /* 32 is an arbitrary value diff --git a/src/procmime.h b/src/procmime.h index 5b276ba98..122a530de 100644 --- a/src/procmime.h +++ b/src/procmime.h @@ -151,6 +151,8 @@ struct _MimeInfo /* Privacy */ PrivacyData *privacy; + + gboolean broken; }; #define IS_BOUNDARY(s, bnd, len) \ -- 2.25.1