]> granicus.if.org Git - php/commitdiff
Fixed corruption of multibyte character including 0x5c as second
authorRui Hirokawa <hirokawa@php.net>
Sat, 28 Jun 2003 08:51:05 +0000 (08:51 +0000)
committerRui Hirokawa <hirokawa@php.net>
Sat, 28 Jun 2003 08:51:05 +0000 (08:51 +0000)
  byte in multipart/form-data.

NEWS
ext/mbstring/mbstring.c
ext/mbstring/mbstring.h
main/rfc1867.c

diff --git a/NEWS b/NEWS
index 54a24008b1a121c80f4a195f6a4e3eb503d6fd76..64877e61bde6f6cfab69b7c313e7dc902441426c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,8 @@ PHP 4                                                                      NEWS
   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 3d9a67e229a42f58e84fb7f0489005dc521baf57..10d14341116c7f1a5833ebc7ceade373d17fc09f 100644 (file)
@@ -3601,6 +3601,127 @@ 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;
+       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;
+       }
+}
+/* }}} */
+
 #ifdef ZEND_MULTIBYTE
 /* {{{ MBSTRING_API int php_mb_set_zend_encoding() */
 MBSTRING_API int php_mb_set_zend_encoding(TSRMLS_D)
index 5cfc45326a81c52706cd1a21379823cae5169b49..67b0817dbe2d38e3535b62a352849b25774baa3a 100644 (file)
@@ -136,6 +136,12 @@ 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;
index 36c521f28848a5809d3fac6df865a32e552ab36f..7d88ea4a452baf1d9892b2acdc0087dcc132f80c 100644 (file)
@@ -521,7 +521,7 @@ static char *substring_conf(char *start, int len, char quote TSRMLS_DC)
                } 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 @@ static char *php_ap_getword_conf(char **line TSRMLS_DC)
 {
        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 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler)
 {
        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 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler)
                                        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 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler)
 
 #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, '\\');