From 443f0aba47fb02df592e43a5933b19dcb8b6021d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 24 Jul 2001 22:23:40 +0000 Subject: Handle broken mailers that send unencoded 8bit header params. And there 2001-07-24 Jeffrey Stedfast * camel-mime-utils.c (header_decode_param): Handle broken mailers that send unencoded 8bit header params. And there was much rejoicing. Rah. svn path=/trunk/; revision=11362 --- camel/ChangeLog | 4 ++++ camel/camel-mime-utils.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/camel/ChangeLog b/camel/ChangeLog index 59cadc3f9a..549841417e 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,5 +1,9 @@ 2001-07-24 Jeffrey Stedfast + * camel-mime-utils.c (header_decode_param): Handle broken mailers + that send unencoded 8bit header params. And there was much + rejoicing. Rah. + * camel-url.h (CAMEL_URL_HIDE_ALL): New #define, and there was much rejoicing. Rah. diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c index e5c90dabd0..f8e4745400 100644 --- a/camel/camel-mime-utils.c +++ b/camel/camel-mime-utils.c @@ -1970,6 +1970,43 @@ header_decode_param (const char **in, char **paramp, char **valuep, int *is_rfc2 } } + if (!g_utf8_validate (value, -1, NULL)) { + /* The (broken) mailer sent us an unencoded 8bit value + * attempt to save it by assuming it's in the user's + * locale and converting to utf8 */ + char *outbase, *outbuf, *p; + const char *inbuf; + int inlen, outlen; + iconv_t ic; + + inbuf = value; + inlen = strlen (inbuf); + + ic = iconv_open ("UTF-8", camel_charset_locale_name ()); + if (ic != (iconv_t) -1) { + int ret; + + outlen = inlen * 6 + 16; + outbuf = outbase = g_malloc (outlen); + + ret = iconv (ic, &inbuf, &inlen, &outbuf, &outlen); + if (ret >= 0) { + iconv (ic, NULL, 0, &outbuf, &outlen); + *outbuf = '\0'; + } + + iconv_close (ic); + + g_free (value); + value = outbase; + } else { + /* Okay, so now what? I guess we convert invalid chars to _'s? */ + for (p = value; *p; p++) + if (!isascii ((unsigned) *p)) + *p = '_'; + } + } + if (param && value) { *paramp = param; *valuep = value; -- cgit v1.2.3