From: Moriyoshi Koizumi Date: Tue, 14 Jan 2003 15:14:11 +0000 (+0000) Subject: Made php_quot_print_decode() RFC2045-compliant X-Git-Tag: PHP_5_0_dev_before_13561_fix~245 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bde6801add0bf9ece403ac6e7d4bd6b9d1e27f4b;p=php Made php_quot_print_decode() RFC2045-compliant # this function is only used in iconv extension and the corresponding # userland function doesn't use it, so I don't see any BC issue here. --- diff --git a/ext/standard/quot_print.c b/ext/standard/quot_print.c index b60bc517d0..1e3137e397 100644 --- a/ext/standard/quot_print.c +++ b/ext/standard/quot_print.c @@ -57,60 +57,78 @@ PHPAPI unsigned char *php_quot_print_decode(const unsigned char *str, size_t len register unsigned char *p2; register unsigned int h_nbl, l_nbl; - size_t decoded_len; + size_t decoded_len, buf_size; unsigned char *retval; static unsigned int hexval_tbl[256] = { - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 16, 16, 16, 16, 16, - 16, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 + 64, 64, 64, 64, 64, 64, 64, 64, 64, 32, 16, 64, 64, 16, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 32, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 64, 64, 64, 64, 64, 64, + 64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 }; - i = length, p1 = str; decoded_len = length; + i = length, p1 = str; buf_size = length; - while (i > 0 && *p1 != '\0') { + while (i > 1 && *p1 != '\0') { if (*p1 == '=') { - decoded_len -= 2; - p1 += 2; - i -= 2; + buf_size -= 2; + p1++; + i--; } p1++; i--; } - retval = emalloc(decoded_len + 1); + retval = emalloc(buf_size + 1); i = length; p1 = str; p2 = retval; + decoded_len = 0; while (i > 0 && *p1 != '\0') { if (*p1 == '=') { - if (i < 2 || - (h_nbl = hexval_tbl[p1[1]]) > 15 || - (l_nbl = hexval_tbl[p1[2]]) > 15) { - + i--, p1++; + if (i == 0 || *p1 == '\0') { + break; + } + h_nbl = hexval_tbl[*p1]; + if (h_nbl < 16) { + /* next char should be a hexadecimal digit */ + if ((--i) == 0 || (l_nbl = hexval_tbl[*(++p1)]) >= 16) { + efree(retval); + return NULL; + } + *(p2++) = (h_nbl << 4) | l_nbl, decoded_len++; + i--, p1++; + } else if (h_nbl < 64) { + /* soft line break */ + while (h_nbl == 32) { + if (--i == 0 || (h_nbl = hexval_tbl[*(++p1)]) == 64) { + efree(retval); + return NULL; + } + } + if (p1[0] == '\r' && i >= 2 && p1[1] == '\n') { + i--, p1++; + } + i--, p1++; + } else { efree(retval); return NULL; } - - *(p2++) = (h_nbl << 4) | l_nbl; - i -= 3; - p1 += 3; } else { *(p2++) = *p1; - i--; - p1++; + i--, p1++, decoded_len++; } }