diff options
author | Kevin McCarthy <kevin@8t8.us> | 2013-10-05 15:57:49 +0800 |
---|---|---|
committer | Kevin McCarthy <kevin@8t8.us> | 2013-10-05 15:57:49 +0800 |
commit | 49bc7c240a99f5caaee60d8c8254ce4edf45551a (patch) | |
tree | 0dc8544dc67a56fa211b72707de73f21752e7cd2 | |
parent | f30819adefe01da0a2d22e965071c75feb568a35 (diff) |
Fix segfault when viewing text attachments in compose menu. (closes #3644)
The segfault was introduced in changeset b9f9e3147eb4. Since decoding
and charset conversion aren't needed for attachments when composing a
message, this patch reverts to just using mutt_save_attachment() to view
"raw data" for text attachments in the compose/send case.
This patch is based on Michael Elkins' patch at
http://dev.mutt.org/trac/attachment/ticket/3644/view_attach_compose_segfault
with just a missing return value check added.
-rw-r--r-- | attach.c | 51 |
1 files changed, 32 insertions, 19 deletions
@@ -504,27 +504,40 @@ int mutt_view_attachment (FILE *fp, BODY *a, int flag, HEADER *hdr, if (flag == M_AS_TEXT) { - /* just let me see the raw data. - * - * Don't use mutt_save_attachment() because we want to perform charset - * conversion since this will be displayed by the internal pager. - */ - STATE decode_state; - - memset(&decode_state, 0, sizeof(decode_state)); - decode_state.fpout = safe_fopen(pagerfile, "w"); - if (!decode_state.fpout) + /* just let me see the raw data */ + if (fp) { - dprint(1, (debugfile, "mutt_view_attachment:%d safe_fopen(%s) errno=%d %s\n", __LINE__, pagerfile, errno, strerror(errno))); - mutt_perror(pagerfile); - mutt_sleep(1); - goto return_error; + /* Viewing from a received message. + * + * Don't use mutt_save_attachment() because we want to perform charset + * conversion since this will be displayed by the internal pager. + */ + STATE decode_state; + + memset(&decode_state, 0, sizeof(decode_state)); + decode_state.fpout = safe_fopen(pagerfile, "w"); + if (!decode_state.fpout) + { + dprint(1, (debugfile, "mutt_view_attachment:%d safe_fopen(%s) errno=%d %s\n", __LINE__, pagerfile, errno, strerror(errno))); + mutt_perror(pagerfile); + mutt_sleep(1); + goto return_error; + } + decode_state.fpin = fp; + decode_state.flags = M_CHARCONV; + mutt_decode_attachment(a, &decode_state); + if (fclose(decode_state.fpout) == EOF) + dprint(1, (debugfile, "mutt_view_attachment:%d fclose errno=%d %s\n", __LINE__, pagerfile, errno, strerror(errno))); + } + else + { + /* in compose mode, just copy the file. we can't use + * mutt_decode_attachment() since it assumes the content-encoding has + * already been applied + */ + if (mutt_save_attachment(fp, a, pagerfile, 0, NULL)) + goto return_error; } - decode_state.fpin = fp; - decode_state.flags = M_CHARCONV; - mutt_decode_attachment(a, &decode_state); - if (fclose(decode_state.fpout) == EOF) - dprint(1, (debugfile, "mutt_view_attachment:%d fclose errno=%d %s\n", __LINE__, pagerfile, errno, strerror(errno))); } else { |