Avoid giving GMime a NULL MIME-stream filter.
authorCarl Worth <cworth@cworth.org>
Sat, 5 Jun 2010 15:40:26 +0000 (08:40 -0700)
committerCarl Worth <cworth@cworth.org>
Sat, 5 Jun 2010 15:40:26 +0000 (08:40 -0700)
Micah Anderson reported an issue where a message failed to display in
the emacs interface, (it instead gave an error, "json-read-string: Bad
string format").

Micah tracked this down to the json output from "notmuch show" being
interrupted by a GMime error message:

gmime-CRITICAL **: g_mime_stream_filter_add: assertion
`GMIME_IS_FILTER (filter)

I tracked this down further to notmuch passing a NULL value to
g_mime_stream_filter_add. And this was due to calling
g_mime_filter_charset_new with a value of "unknown-8bit".

So we add a test message withe a Conten-Type of "text/plain;
charset=unknown-8bit" from Micah's message. Then we fix "notmuch show"
to test for NULL before calling g_mime_stream_filter_add. Bug fixed.

notmuch-show.c
test/notmuch-test

index 26449fa5bd0c2efde1d6f45460ee36cef60ce342..4ed5fc74a1796f98ef41da996c7f4ee5e55df6a4 100644 (file)
@@ -225,9 +225,15 @@ show_part_content (GMimeObject *part, GMimeStream *stream_out)
        g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
                                 g_mime_filter_crlf_new(FALSE, FALSE));
         if (charset) {
-          g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
-                                   g_mime_filter_charset_new(charset, "UTF-8"));
-        }
+           GMimeFilter *charset_filter;
+           charset_filter = g_mime_filter_charset_new(charset, "UTF-8");
+           /* This result can be NULL for things like "unknown-8bit".
+            * Don't set a NULL filter as that makes GMime print
+            * annoying assertion-failure messages on stderr. */
+           if (charset_filter)
+               g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
+                                        charset_filter);
+       }
     }
 
     wrapper = g_mime_part_get_content_object (GMIME_PART (part));
index eaaaf89b5da849d58a63a5629efe48d1633ee38e..00ac6b0e3a2e11ba0adb6c3966b570210d999f9a 100755 (executable)
@@ -67,6 +67,7 @@ increment_mtime ()
 #  [reply-to]=some-address
 #  [in-reply-to]=<message-id>
 #  [references]=<message-id>
+#  [content-type]=content-type-specification
 #  '[header]=full header line, including keyword'
 #
 #      Additional values for email headers. If these are not provided
@@ -147,6 +148,11 @@ ${additional_headers}"
 ${additional_headers}"
     fi
 
+    if [ ! -z "${template[content-type]}" ]; then
+       additional_headers="Content-Type: ${template[content-type]}
+${additional_headers}"
+    fi
+
 
 cat <<EOF >$gen_msg_filename
 From: ${template[from]}
@@ -1147,6 +1153,27 @@ printf " Ensure all messages were threaded together...\t"
 output=$($NOTMUCH search 'subject:"a ridiculously-long message ID"' | notmuch_search_sanitize)
 pass_if_equal "$output" "thread:XXX   2001-01-05 [1/3] Notmuch Test Suite; A ridiculously-long message ID (inbox unread)"
 
+printf "\nTesting encoding issues...\n"
+printf " Message with text of unknown charset...\t"
+add_message '[content-type]="text/plain; charset=unknown-8bit"' \
+            '[body]=irrelevant'
+
+output=$($NOTMUCH show id:${gen_msg_id} 2>&1 | notmuch_show_sanitize)
+pass_if_equal "$output" "\fmessage{ id:msg-074@notmuch-test-suite depth:0 match:1 filename:/XXX/mail/msg-074
+\fheader{
+Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-05) (inbox unread)
+Subject: Test message #74
+From: Notmuch Test Suite <test_suite@notmuchmail.org>
+To: Notmuch Test Suite <test_suite@notmuchmail.org>
+Date: Tue, 05 Jan 2001 15:43:57 -0800
+\fheader}
+\fbody{
+\fpart{ ID: 1, Content-type: text/plain
+irrelevant
+\fpart}
+\fbody}
+\fmessage}"
+
 echo ""
 echo "Notmuch test suite complete."