changeset: 6310:035306822940
user:      Kevin McCarthy <[email protected]>
date:      Sat Oct 05 15:57:49 2013 +0800
link:      http://dev.mutt.org/hg/mutt/rev/035306822940

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.

diffs (62 lines):

diff -r 6bcde5f1c7a7 -r 035306822940 attach.c
--- a/attach.c  Sun Oct 06 14:32:45 2013 +0000
+++ b/attach.c  Sat Oct 05 15:57:49 2013 +0800
@@ -504,27 +504,40 @@
 
     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;
+      /* just let me see the raw data */
+      if (fp)
+      {
+       /* 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)
+       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
       {
-       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;
+       /* 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
     {

Reply via email to