]> granicus.if.org Git - neomutt/commitdiff
Fix #2173.
authorTAKAHASHI Tamotsu <ttakah@lapis.plala.or.jp>
Tue, 11 Jul 2006 23:34:11 +0000 (23:34 +0000)
committerTAKAHASHI Tamotsu <ttakah@lapis.plala.or.jp>
Tue, 11 Jul 2006 23:34:11 +0000 (23:34 +0000)
mbyte.c
protos.h
rfc2047.c
rfc2231.c

diff --git a/mbyte.c b/mbyte.c
index ad7342d4807b21820d3e319e89c99c9f095ddccd..726b0b41ca07084d717e68430118eb68d8bbf7f8 100644 (file)
--- a/mbyte.c
+++ b/mbyte.c
@@ -469,3 +469,36 @@ wchar_t replacement_char (void)
 {
   return Charset_is_utf8 ? 0xfffd : '?';
 }
+
+int mutt_filter_unprintable (char **s)
+{
+  BUFFER *b = NULL;
+  wchar_t wc;
+  size_t k, k2;
+  char scratch[MB_LEN_MAX + 1];
+  char *p = *s;
+  mbstate_t mbstate1, mbstate2;
+
+  if (!(b = mutt_buffer_init (b)))
+    return -1;
+  memset (&mbstate1, 0, sizeof (mbstate1));
+  memset (&mbstate2, 0, sizeof (mbstate2));
+  for (; (k = mbrtowc (&wc, p, MB_LEN_MAX, &mbstate1)); p += k)
+  {
+    if (k == (size_t)(-1) || k == (size_t)(-2))
+    {
+      k = 1;
+      wc = replacement_char();
+    }
+    if (!IsWPrint (wc))
+      wc = '?';
+    k2 = wcrtomb (scratch, wc, &mbstate2);
+    scratch[k2] = '\0';
+    mutt_buffer_addstr (b, scratch);
+  }
+  FREE (s);  /* __FREE_CHECKED__ */
+  *s = b->data ? b->data : safe_calloc (1, 1);
+  FREE (&b);
+  return 0;
+}
+
index 211cb65601b60b62974ddc6e1f877c0231608b45..857e115b4d4ac50f63b398e665ec01b3c1ce83d0 100644 (file)
--- a/protos.h
+++ b/protos.h
@@ -180,6 +180,7 @@ void mutt_display_sanitize (char *);
 void mutt_edit_content_type (HEADER *, BODY *, FILE *);
 void mutt_edit_file (const char *, const char *);
 void mutt_edit_headers (const char *, const char *, HEADER *, char *, size_t);
+int mutt_filter_unprintable (char **);
 void mutt_curses_error (const char *, ...);
 void mutt_curses_message (const char *, ...);
 void mutt_enter_command (void);
index 158423e6ba91c7304a31dcc91f103bd987ab0af3..8b1eb99db2cf334432ab6d0623d65595332324ab 100644 (file)
--- a/rfc2047.c
+++ b/rfc2047.c
@@ -670,6 +670,7 @@ static int rfc2047_decode_word (char *d, const char *s, size_t len)
   
   if (charset)
     mutt_convert_string (&d0, charset, Charset, M_ICONV_HOOK_FROM);
+  mutt_filter_unprintable (&d0);
   strfcpy (d, d0, len);
   FREE (&charset);
   FREE (&d0);
index 3ad3b3ab276ef4d26dfa3633d497857e8d3e6388..ae33cca94d6c67fc150c33f68928fba973b8db59 100644 (file)
--- a/rfc2231.c
+++ b/rfc2231.c
@@ -129,6 +129,7 @@ void rfc2231_decode_parameters (PARAMETER **headp)
       s = rfc2231_get_charset (p->value, charset, sizeof (charset));
       rfc2231_decode_one (p->value, s);
       mutt_convert_string (&p->value, charset, Charset, M_ICONV_HOOK_FROM);
+      mutt_filter_unprintable (&p->value);
 
       *last = p;
       last = &p->next;