From: TAKAHASHI Tamotsu Date: Tue, 11 Jul 2006 23:34:11 +0000 (+0000) Subject: Fix #2173. X-Git-Tag: mutt-1-5-12-rel~12 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=de8d8e8fe15a007d6bf33c2323dd7ee9c8cc4d37;p=mutt Fix #2173. --- diff --git a/mbyte.c b/mbyte.c index ad7342d4..726b0b41 100644 --- 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; +} + diff --git a/protos.h b/protos.h index 211cb656..857e115b 100644 --- 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); diff --git a/rfc2047.c b/rfc2047.c index 158423e6..8b1eb99d 100644 --- 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); diff --git a/rfc2231.c b/rfc2231.c index 3ad3b3ab..ae33cca9 100644 --- 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;