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

Reply via email to