hirokawa                Sat Jun 28 19:37:18 2003 EDT

  Modified files:              
    /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.1431 php-src/NEWS:1.1432
--- php-src/NEWS:1.1431 Sat Jun 28 01:22:39 2003
+++ php-src/NEWS        Sat Jun 28 19:37:18 2003
@@ -4,6 +4,9 @@
 
 ? ? ??? 2003, PHP 5 Beta 1 
 
+- Fixed corruption of multibyte character including 0x5c as second
+  byte in multipart/form-data. (Rui)
+
 - Switch to using Zend Engine 2, which includes numerous engine level 
   improvements.  A full list is available at 
   http://www.php.net/zend-engine-2.php.
Index: php-src/ext/mbstring/mbstring.c
diff -u php-src/ext/mbstring/mbstring.c:1.176 php-src/ext/mbstring/mbstring.c:1.177
--- php-src/ext/mbstring/mbstring.c:1.176       Tue Jun 10 16:03:31 2003
+++ php-src/ext/mbstring/mbstring.c     Sat Jun 28 19:37:18 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: mbstring.c,v 1.176 2003/06/10 20:03:31 imajes Exp $ */
+/* $Id: mbstring.c,v 1.177 2003/06/28 23:37:18 hirokawa Exp $ */
 
 /*
  * PHP4 Multibyte String module "mbstring"
@@ -3219,6 +3219,124 @@
 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;
+       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;
+       }
 }
 /* }}} */
 
Index: php-src/ext/mbstring/mbstring.h
diff -u php-src/ext/mbstring/mbstring.h:1.54 php-src/ext/mbstring/mbstring.h:1.55
--- php-src/ext/mbstring/mbstring.h:1.54        Tue Jun 10 16:03:31 2003
+++ php-src/ext/mbstring/mbstring.h     Sat Jun 28 19:37:18 2003
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: mbstring.h,v 1.54 2003/06/10 20:03:31 imajes Exp $ */
+/* $Id: mbstring.h,v 1.55 2003/06/28 23:37:18 hirokawa Exp $ */
 
 /*
  * PHP4 Multibyte String module "mbstring" (currently only for Japanese)
@@ -136,6 +136,13 @@
 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.137 php-src/main/rfc1867.c:1.138
--- php-src/main/rfc1867.c:1.137        Tue Jun 10 16:03:42 2003
+++ php-src/main/rfc1867.c      Sat Jun 28 19:37:18 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: rfc1867.c,v 1.137 2003/06/10 20:03:42 imajes Exp $ */
+/* $Id: rfc1867.c,v 1.138 2003/06/28 23:37:18 hirokawa Exp $ */
 
 /*
  *  This product includes software developed by the Apache Group
@@ -525,7 +525,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++];
                                }
@@ -548,6 +548,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;
        }
@@ -690,7 +696,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, anonindex=0, is_anonymous;
+       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, anonindex=0, is_anonymous;
        zval *http_post_files=NULL;
        zend_bool magic_quotes_gpc;
        multipart_buffer *mbuff;
@@ -806,6 +812,14 @@
                                }
 
                                sapi_module.input_filter(PARSE_POST, param, &value, 
strlen(value) TSRMLS_CC);
+#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);
@@ -931,6 +945,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

Reply via email to