moriyoshi Tue Jan 14 10:14:11 2003 EDT
Modified files:
/php4/ext/standard quot_print.c
Log:
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.
Index: php4/ext/standard/quot_print.c
diff -u php4/ext/standard/quot_print.c:1.24 php4/ext/standard/quot_print.c:1.25
--- php4/ext/standard/quot_print.c:1.24 Mon Jan 6 10:47:25 2003
+++ php4/ext/standard/quot_print.c Tue Jan 14 10:14:11 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: quot_print.c,v 1.24 2003/01/06 15:47:25 moriyoshi Exp $ */
+/* $Id: quot_print.c,v 1.25 2003/01/14 15:14:11 moriyoshi Exp $ */
#include <stdlib.h>
@@ -57,60 +57,78 @@
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++;
}
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php