hirokawa Sat Jun 28 04:51:05 2003 EDT Modified files: (Branch: PHP_4_3) /php-src NEWS /php-src/ext/mbstring mbstring.c mbstring.h /php-src/main rfc1867.c Log: Fixed corruption of multibyte character including 0x5c as second byte in multipart/form-data.
Index: php-src/NEWS diff -u php-src/NEWS:1.1247.2.267 php-src/NEWS:1.1247.2.268 --- php-src/NEWS:1.1247.2.267 Tue Jun 24 14:00:13 2003 +++ php-src/NEWS Sat Jun 28 04:51:05 2003 @@ -7,6 +7,8 @@ when open_basedir is used). (Ilia) - Fixed bug #24284 (Fixed memory leak inside pg_ping()). (Ilia) - Fixed bug #24028 (Reading raw post message by php://input failed). (Jani) +- Fixed corruption of multibyte character including 0x5c as second + byte in multipart/form-data. (Rui) 19 Jun 2003, Version 4.3.3RC1 - Synchronized bundled GD library with GD 2.0.15. (Ilia) Index: php-src/ext/mbstring/mbstring.c diff -u php-src/ext/mbstring/mbstring.c:1.142.2.17 php-src/ext/mbstring/mbstring.c:1.142.2.18 --- php-src/ext/mbstring/mbstring.c:1.142.2.17 Fri May 16 15:28:17 2003 +++ php-src/ext/mbstring/mbstring.c Sat Jun 28 04:51:05 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mbstring.c,v 1.142.2.17 2003/05/16 19:28:17 moriyoshi Exp $ */ +/* $Id: mbstring.c,v 1.142.2.18 2003/06/28 08:51:05 hirokawa Exp $ */ /* * PHP4 Multibyte String module "mbstring" @@ -3598,6 +3598,127 @@ MBSTRING_API char *php_mb_strrchr(const char *s, char c TSRMLS_DC) { return php_mb_safe_strrchr(s, c, -1 TSRMLS_CC); +} +/* }}} */ + +/* {{{ MBSTRING_API size_t php_mb_gpc_mbchar_bytes() */ +MBSTRING_API size_t php_mb_gpc_mbchar_bytes(const char *s TSRMLS_DC) +{ + + if (MBSTRG(http_input_identify) != mbfl_no_encoding_invalid){ + return php_mb_mbchar_bytes_ex(s, + mbfl_no2encoding(MBSTRG(http_input_identify))); + } else { + return php_mb_mbchar_bytes_ex(s, + mbfl_no2encoding(MBSTRG(internal_encoding))); + } +} +/* }}} */ + +/* {{{ MBSTRING_API int php_mb_gpc_encoding_converter() */ +MBSTRING_API int php_mb_gpc_encoding_converter(char **str, int *len, const char *encoding_to, const char *encoding_from + TSRMLS_DC) +{ + mbfl_string string, result, *ret; + enum mbfl_no_encoding from_encoding, to_encoding; + mbfl_buffer_converter *convd; + + if (encoding_to) { + /* new encoding */ + to_encoding = mbfl_name2no_encoding(encoding_to); + if (to_encoding == mbfl_no_encoding_invalid) { + return -1; + } + } else { + to_encoding = MBSTRG(current_internal_encoding); + } + if (encoding_from) { + /* old encoding */ + from_encoding = mbfl_name2no_encoding(encoding_from); + if (from_encoding == mbfl_no_encoding_invalid) { + return -1; + } + } else { + from_encoding = MBSTRG(http_input_identify); + } + + /* initialize string */ + mbfl_string_init(&string); + mbfl_string_init(&result); + string.no_encoding = from_encoding; + string.no_language = MBSTRG(current_language); + string.val = (char*)(*str); + string.len = *len; + + /* initialize converter */ + convd = mbfl_buffer_converter_new(from_encoding, to_encoding, string.len TSRMLS_CC); + if (convd == NULL) { + return -1; + } + mbfl_buffer_converter_illegal_mode(convd, MBSTRG(current_filter_illegal_mode) TSRMLS_CC); + mbfl_buffer_converter_illegal_substchar(convd, MBSTRG(current_filter_illegal_substchar) TSRMLS_CC); + + /* do it */ + ret = mbfl_buffer_converter_feed_result(convd, &string, &result TSRMLS_CC); + if (ret != NULL) { + efree(*str); + *str = ret->val; + *len = ret->len; + } + mbfl_buffer_converter_delete(convd TSRMLS_CC); + + return ret ? 0 : -1; +} + +/* {{{ MBSTRING_API int php_mb_gpc_encoding_detector() + */ +MBSTRING_API int php_mb_gpc_encoding_detector(const char *arg_string, int arg_length, char *arg_list TSRMLS_DC) +{ + mbfl_string string; + const char *ret; + enum mbfl_no_encoding *elist; + enum mbfl_no_encoding encoding; + + int size, *list; + + if (arg_list && strlen(arg_list)>0) { + /* make encoding list */ + list = NULL; + size = 0; + php_mb_parse_encoding_list(arg_list, strlen(arg_list), &list, &size, 0); + + if (size > 0 && list != NULL) { + elist = list; + } else { + elist = MBSTRG(current_detect_order_list); + size = MBSTRG(current_detect_order_list_size); + if (size <= 0){ + elist = (int*)php_mbstr_default_identify_list; + size = php_mbstr_default_identify_list_size; + } + } + } else { + elist = MBSTRG(current_detect_order_list); + size = MBSTRG(current_detect_order_list_size); + if (size <= 0){ + elist = (int*)php_mbstr_default_identify_list; + size = php_mbstr_default_identify_list_size; + } + } + + mbfl_string_init(&string); + string.no_language = MBSTRG(current_language); + string.val = (char*)arg_string; + string.len = arg_length; + encoding = mbfl_identify_encoding_no(&string, elist, size TSRMLS_CC); + if (encoding != mbfl_no_encoding_invalid) { + MBSTRG(http_input_identify) = encoding; + sapi_module.sapi_error(E_WARNING, "encoding: %s %s", string.val, (char *)mbfl_no_encoding2name(encoding)); + return SUCCESS; + } else { + sapi_module.sapi_error(E_WARNING, "encoding detection failed: %s ", string.val); + return FAILURE; + } } /* }}} */ Index: php-src/ext/mbstring/mbstring.h diff -u php-src/ext/mbstring/mbstring.h:1.40.2.5 php-src/ext/mbstring/mbstring.h:1.40.2.6 --- php-src/ext/mbstring/mbstring.h:1.40.2.5 Mon May 12 09:31:16 2003 +++ php-src/ext/mbstring/mbstring.h Sat Jun 28 04:51:05 2003 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mbstring.h,v 1.40.2.5 2003/05/12 13:31:16 moriyoshi Exp $ */ +/* $Id: mbstring.h,v 1.40.2.6 2003/06/28 08:51:05 hirokawa Exp $ */ /* * PHP4 Multibyte String module "mbstring" (currently only for Japanese) @@ -136,6 +136,12 @@ MBSTRING_API size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *enc); MBSTRING_API size_t php_mb_mbchar_bytes(const char *s TSRMLS_DC); +MBSTRING_API size_t php_mb_gpc_mbchar_bytes(const char *s TSRMLS_DC); + +MBSTRING_API int php_mb_encoding_detector_ex(const char *arg_string, int arg_length, char *arg_list TSRMLS_DC); + +MBSTRING_API int php_mb_encoding_converter_ex(char **str, int *len, const char *encoding_to, + const char *encoding_from TSRMLS_DC); ZEND_BEGIN_MODULE_GLOBALS(mbstring) enum mbfl_no_language language; Index: php-src/main/rfc1867.c diff -u php-src/main/rfc1867.c:1.122.2.10 php-src/main/rfc1867.c:1.122.2.11 --- php-src/main/rfc1867.c:1.122.2.10 Fri May 23 17:37:16 2003 +++ php-src/main/rfc1867.c Sat Jun 28 04:51:05 2003 @@ -16,7 +16,7 @@ | Jani Taskinen <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: rfc1867.c,v 1.122.2.10 2003/05/23 21:37:16 pollita Exp $ */ +/* $Id: rfc1867.c,v 1.122.2.11 2003/06/28 08:51:05 hirokawa Exp $ */ /* * This product includes software developed by the Apache Group @@ -521,7 +521,7 @@ } else { #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) if (php_mb_encoding_translation(TSRMLS_C)) { - size_t j = php_mb_mbchar_bytes(start+i TSRMLS_CC); + size_t j = php_mb_gpc_mbchar_bytes(start+i TSRMLS_CC); while (j-- > 0 && i < len) { *resp++ = start[i++]; } @@ -544,6 +544,12 @@ { char *str = *line, *strend, *res, quote; +#if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) + if (php_mb_encoding_translation(TSRMLS_C)) { + php_mb_gpc_encoding_detector(str, strlen(str), NULL TSRMLS_CC); + } +#endif + while (*str && isspace(*str)) { ++str; } @@ -686,7 +692,7 @@ { char *boundary, *s=NULL, *boundary_end = NULL, *start_arr=NULL, *array_index=NULL; char *temp_filename=NULL, *lbuf=NULL, *abuf=NULL; - int boundary_len=0, total_bytes=0, cancel_upload=0, is_arr_upload=0, array_len=0, max_file_size=0, skip_upload=0; + int boundary_len=0, total_bytes=0, cancel_upload=0, is_arr_upload=0, array_len=0, max_file_size=0, skip_upload=0, str_len=0; zval *http_post_files=NULL; zend_bool magic_quotes_gpc; multipart_buffer *mbuff; @@ -801,6 +807,14 @@ value = estrdup(""); } +#if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) + if (php_mb_encoding_translation(TSRMLS_C)) { + if (php_mb_gpc_encoding_detector(value, strlen(value), NULL TSRMLS_CC) == SUCCESS) { + str_len = strlen(value); + php_mb_gpc_encoding_converter(&value , &str_len, NULL, NULL TSRMLS_CC); + } + } +#endif safe_php_register_variable(param, value, array_ptr, 0 TSRMLS_CC); if (!strcasecmp(param, "MAX_FILE_SIZE")) { max_file_size = atol(value); @@ -927,6 +941,10 @@ #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) if (php_mb_encoding_translation(TSRMLS_C)) { + if(php_mb_gpc_encoding_detector(filename, strlen(filename), NULL TSRMLS_CC) == SUCCESS) { + str_len = strlen(filename); + php_mb_gpc_encoding_converter(&filename, &str_len, NULL, NULL TSRMLS_CC); + } s = php_mb_strrchr(filename, '\\' TSRMLS_CC); } else { s = strrchr(filename, '\\');
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php