# HG changeset patch # User Mark Doliner # Date 1084939328 0 # Node ID 6f21aa413b18330d663231796ffcbaa4bbfbe51c # Parent 574393ccd705fb7da3fb8036ab316bedcd7a8b87 [gaim-migrate @ 9750] "This patch fixes two relatively minor problems for the new gaim_mime_decode_field code: 1. Use g_return_val_if_fail to check for NULL. (Problem discovered by shx) 2. Added code to handle the boundary case =?charset?encoding??= (i.e., no encoded-text) Some comments also have been changed/added for clarification." --Ambrose C. LI committer: Tailor Script diff -r 574393ccd705 -r 6f21aa413b18 src/util.c --- a/src/util.c Wed May 19 03:54:49 2004 +0000 +++ b/src/util.c Wed May 19 04:02:08 2004 +0000 @@ -317,7 +317,7 @@ const char *charset0 = NULL, *encoding0 = NULL, *encoded_text0 = NULL; char *n, *new; - /* token can be any CHAR, not necessarily ASCII */ + /* token can be any CHAR (supposedly ISO8859-1/ISO2022), not just ASCII */ #define token_char_p(c) \ (c != ' ' && !iscntrl(c) && !strchr("()<>@,;:\"/[]?.=", c)) @@ -328,7 +328,12 @@ #define RECOVER_MARKED_TEXT strncpy(n, mark, cur - mark + 1); \ n += cur - mark + 1 - /* NOTE: Assuming that we need just strlen(str)+1 may be wrong */ + g_return_val_if_fail(str != NULL, NULL); + + /* NOTE: Assuming that we need just strlen(str)+1 *may* be wrong. + * It would be wrong if one byte (in some unknown encoding) could + * expand to >=4 bytes of UTF-8; I don't know if there are such things. + */ n = new = g_malloc(strlen(str) + 1); /* Here we will be looking for encoded words and if they seem to be @@ -358,7 +363,7 @@ case state_charset: if (*cur == '?') { state = state_question2; - } else if (!token_char_p(*cur)) { + } else if (!token_char_p(*cur)) { /* This should never happen */ RECOVER_MARKED_TEXT; state = state_start; } @@ -375,7 +380,7 @@ case state_encoding: if (*cur == '?') { state = state_question3; - } else if (!token_char_p(*cur)) { + } else if (!token_char_p(*cur)) { /* This should never happen */ RECOVER_MARKED_TEXT; state = state_start; } @@ -384,6 +389,9 @@ if (encoded_text_char_p(*cur)) { encoded_text0 = cur; state = state_encoded_text; + } else if (*cur == '?') { /* empty string */ + encoded_text0 = cur; + state = state_question4; } else { /* This should never happen */ RECOVER_MARKED_TEXT; state = state_start;