diff options
author | Robert Brady <rwb197@ecs.soton.ac.uk> | 1999-08-06 23:47:45 +0800 |
---|---|---|
committer | Robert Brady <rbrady@src.gnome.org> | 1999-08-06 23:47:45 +0800 |
commit | 85067acb32a4992410e337352f8c54b61b78709b (patch) | |
tree | 88fdde821bfecfd1a33d2c9c6d760fab8341506a /camel/gmime-rfc2047.c | |
parent | f3e57fa18f42e44f81f1eedc2db85a4125752d20 (diff) | |
download | gsoc2013-evolution-85067acb32a4992410e337352f8c54b61b78709b.tar gsoc2013-evolution-85067acb32a4992410e337352f8c54b61b78709b.tar.gz gsoc2013-evolution-85067acb32a4992410e337352f8c54b61b78709b.tar.bz2 gsoc2013-evolution-85067acb32a4992410e337352f8c54b61b78709b.tar.lz gsoc2013-evolution-85067acb32a4992410e337352f8c54b61b78709b.tar.xz gsoc2013-evolution-85067acb32a4992410e337352f8c54b61b78709b.tar.zst gsoc2013-evolution-85067acb32a4992410e337352f8c54b61b78709b.zip |
encoder test.
1999-08-06 Robert Brady <rwb197@ecs.soton.ac.uk>
* tests/test6.c: encoder test.
* camel/gmime-rfc2047.c: Fixed decoder bug : sequence
?= is not always the terminator for an encoded-string.
svn path=/trunk/; revision=1091
Diffstat (limited to 'camel/gmime-rfc2047.c')
-rw-r--r-- | camel/gmime-rfc2047.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/camel/gmime-rfc2047.c b/camel/gmime-rfc2047.c index 2a44a20dd6..ecb75d519d 100644 --- a/camel/gmime-rfc2047.c +++ b/camel/gmime-rfc2047.c @@ -160,6 +160,7 @@ rfc2047_decode_word (const gchar *data, const gchar *into_what) int b_len = 4096; iconv_t i; strncpy(q, charset, c - charset); + q[c - charset] = 0; i = unicode_iconv_open(into_what, q); if (!i) { g_free(q); @@ -167,11 +168,29 @@ rfc2047_decode_word (const gchar *data, const gchar *into_what) } unicode_iconv(i, &cook_2, &cook_len, &b, &b_len); unicode_iconv_close(i); + *b = 0; } return g_strdup(buffer); } +static gchar * +find_end_of_encoded_word(const gchar *data) { + /* We can't just search for ?=, + because of the case : + "=?charset?q?=ff?=" :( */ + if (!data) return NULL; + data = strstr(data, "=?"); + if (!data) return NULL; + data = strchr(data+2, '?'); + if (!data) return NULL; + data = strchr(data+1, '?'); + if (!data) return NULL; + data = strstr(data+1, "?="); + if (!data) return NULL; + return data + 2; +} + gchar * gmime_rfc2047_decode (const gchar *data, const gchar *into_what) { @@ -185,6 +204,7 @@ gmime_rfc2047_decode (const gchar *data, const gchar *into_what) char *word_start = strstr(data, "=?"), *decoded; if (!word_start) { strcpy(b, data); + b[strlen(data)] = 0; return buffer; } if (word_start != data) { @@ -192,14 +212,16 @@ gmime_rfc2047_decode (const gchar *data, const gchar *into_what) if (strspn(data, " \t\n\r") != (word_start - data)) { strncpy(b, data, word_start - data); b += word_start - data; + *b = 0; } } decoded = rfc2047_decode_word(word_start, into_what); strcpy(b, decoded); b += strlen(decoded); + *b = 0; g_free(decoded); - data = strstr(data, "?=") + 2; + data = find_end_of_encoded_word(data); } *b = 0; |