diff options
author | Rui Hirokawa <hirokawa@php.net> | 2003-06-28 23:37:18 +0000 |
---|---|---|
committer | Rui Hirokawa <hirokawa@php.net> | 2003-06-28 23:37:18 +0000 |
commit | 2b44c63d5084c134c7c80b5f411b25f741d7354d (patch) | |
tree | 153ec5679c1ec5df20617eccca28367496512a49 /ext/mbstring | |
parent | aacd3d2f1bddd397143890ce46f2b5b1c2480e6b (diff) | |
download | php-git-2b44c63d5084c134c7c80b5f411b25f741d7354d.tar.gz |
Fixed corruption of multibyte character including 0x5c as second
byte in multipart/form-data.
Diffstat (limited to 'ext/mbstring')
-rw-r--r-- | ext/mbstring/mbstring.c | 118 | ||||
-rw-r--r-- | ext/mbstring/mbstring.h | 7 |
2 files changed, 125 insertions, 0 deletions
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index bd1ed508c5..23fa8ad664 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -3222,6 +3222,124 @@ MBSTRING_API char *php_mb_strrchr(const char *s, char c TSRMLS_DC) } /* }}} */ +/* {{{ 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; + 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_mb_default_identify_list; + size = php_mb_default_identify_list_size; + } + } + } else { + elist = MBSTRG(current_detect_order_list); + size = MBSTRG(current_detect_order_list_size); + if (size <= 0){ + elist = (int*)php_mb_default_identify_list; + size = php_mb_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; + return SUCCESS; + } else { + return FAILURE; + } +} +/* }}} */ + #ifdef ZEND_MULTIBYTE /* {{{ MBSTRING_API int php_mb_set_zend_encoding() */ MBSTRING_API int php_mb_set_zend_encoding(TSRMLS_D) diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index fdecde7a9f..8e4bd2b911 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -136,6 +136,13 @@ MBSTRING_API int php_mb_check_encoding_list(const char *encoding_list TSRMLS_DC) 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; |