aboutsummaryrefslogtreecommitdiffhomepage
path: root/notmuch-show.c
diff options
context:
space:
mode:
authorGravatar Carl Worth <cworth@cworth.org>2011-05-31 16:13:21 -0700
committerGravatar Carl Worth <cworth@cworth.org>2011-05-31 16:13:21 -0700
commit10a48e0566db1566e6c0221b9f9927ac123a0c1f (patch)
treec57f83d7283f0770d9ea32b4da68b5c607b31052 /notmuch-show.c
parentc6b49ae752e642d779941a63bc65d5107e7010f1 (diff)
notmuch show: Don't do text conversions for non-text parts
This fixes the recently-added test case (in test/multipart) demonstrating corruption of binary parts that happen to contain CRLF pairs. We restore the original code from show_one_part_content to format_part_content_raw. Then, for good measure, we rename show_part_content to the more descriptive show_text_part_content and add an internal error if it is ever called with a non-text part.
Diffstat (limited to 'notmuch-show.c')
-rw-r--r--notmuch-show.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/notmuch-show.c b/notmuch-show.c
index e90f07e3..df601fbb 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -374,13 +374,25 @@ format_headers_json (const void *ctx, notmuch_message_t *message)
talloc_free (ctx_quote);
}
+/* Write a MIME text part out to the given stream.
+ *
+ * Both line-ending conversion (CRLF->LF) and charset conversion ( ->
+ * UTF-8) will be performed, so it is inappropriate to call this
+ * function with a non-text part. Doing so will trigger an internal
+ * error.
+ */
static void
-show_part_content (GMimeObject *part, GMimeStream *stream_out)
+show_text_part_content (GMimeObject *part, GMimeStream *stream_out)
{
+ GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
GMimeStream *stream_filter = NULL;
GMimeDataWrapper *wrapper;
const char *charset;
+ if (! g_mime_content_type_is_type (content_type, "text", "*"))
+ INTERNAL_ERROR ("Illegal request to format non-text part (%s) as text.",
+ g_mime_content_type_to_string (content_type));
+
/* do nothing if this is a multipart */
if (GMIME_IS_MULTIPART (part) || GMIME_IS_MESSAGE_PART (part))
return;
@@ -463,7 +475,7 @@ format_part_content_text (GMimeObject *part)
!g_mime_content_type_is_type (content_type, "text", "html"))
{
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
- show_part_content (part, stream_stdout);
+ show_text_part_content (part, stream_stdout);
g_object_unref(stream_stdout);
}
else if (g_mime_content_type_is_type (content_type, "multipart", "*") ||
@@ -600,7 +612,7 @@ format_part_content_json (GMimeObject *part)
if (g_mime_content_type_is_type (content_type, "text", "*") &&
!g_mime_content_type_is_type (content_type, "text", "html"))
{
- show_part_content (part, stream_memory);
+ show_text_part_content (part, stream_memory);
part_content = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (stream_memory));
printf (", \"content\": %s", json_quote_chararray (ctx, (char *) part_content->data, part_content->len));
@@ -633,10 +645,25 @@ format_part_end_json (GMimeObject *part)
static void
format_part_content_raw (GMimeObject *part)
{
- GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
+ GMimeStream *stream_stdout;
+ GMimeStream *stream_filter = NULL;
+ GMimeDataWrapper *wrapper;
+
+ stream_stdout = g_mime_stream_file_new (stdout);
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
- show_part_content (part, stream_stdout);
- g_object_unref(stream_stdout);
+
+ stream_filter = g_mime_stream_filter_new (stream_stdout);
+
+ wrapper = g_mime_part_get_content_object (GMIME_PART (part));
+
+ if (wrapper && stream_filter)
+ g_mime_data_wrapper_write_to_stream (wrapper, stream_filter);
+
+ if (stream_filter)
+ g_object_unref (stream_filter);
+
+ if (stream_stdout)
+ g_object_unref(stream_stdout);
}
static void