cvs: php-src(PHP_4_3) /ext/mbstring mbstring.c mbstring.h /main rfc1867.c

From: Date: Sat, 25 Oct 2003 10:30:52 +0000
Subject: cvs: php-src(PHP_4_3) /ext/mbstring mbstring.c mbstring.h /main rfc1867.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-24244@lists.php.net to get a copy of this message
hirokawa Sat Oct 25 06:30:52 2003 EDT Modified files: (Branch: PHP_4_3) /php-src/ext/mbstring mbstring.c mbstring.h /php-src/main rfc1867.c Log: name/value in multipart/form-date will be converted into internal encoding when mbstring.encoding_translation is On.

Index: php-src/ext/mbstring/mbstring.c diff -u php-src/ext/mbstring/mbstring.c:1.142.2.28 php-src/ext/mbstring/mbstring.c:1.142.2.29 --- php-src/ext/mbstring/mbstring.c:1.142.2.28 Thu Oct 2 06:10:52 2003 +++ php-src/ext/mbstring/mbstring.c Sat Oct 25 06:30:50 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mbstring.c,v 1.142.2.28 2003/10/02 10:10:52 moriyoshi Exp $ */ +/* $Id: mbstring.c,v 1.142.2.29 2003/10/25 10:30:50 hirokawa Exp $ */ /* * PHP4 Multibyte String module "mbstring" @@ -309,7 +309,7 @@ * of parsed encodings. */ static int -php_mb_parse_encoding_list(const char *value, int value_length, int **return_list, int *return_size, int persistent) +php_mb_parse_encoding_list(const char *value, int value_length, int **return_list, int *return_size, int persistent TSRMLS_DC) { int n, l, size, bauto, *src, *list, *entry, ret = 1; char *p, *p1, *p2, *endp, *tmpstr; @@ -421,7 +421,7 @@ /* {{{ MBSTRING_API php_mb_check_encoding_list */ MBSTRING_API int php_mb_check_encoding_list(const char *encoding_list TSRMLS_DC) { - return php_mb_parse_encoding_list(encoding_list, strlen(encoding_list), NULL, NULL, 0); + return php_mb_parse_encoding_list(encoding_list, strlen(encoding_list), NULL, NULL, 0 TSRMLS_CC); } /* }}} */ @@ -535,7 +535,7 @@ { int *list, size; - if (php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1)) { + if (php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1 TSRMLS_CC)) { if (MBSTRG(detect_order_list) != NULL) { free(MBSTRG(detect_order_list)); } @@ -554,7 +554,7 @@ { int *list, size; - if (php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1)) { + if (php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1 TSRMLS_CC)) { if (MBSTRG(http_input_list) != NULL) { free(MBSTRG(http_input_list)); } @@ -632,7 +632,7 @@ { int *list, size; - if (php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1)) { + if (php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1 TSRMLS_CC)) { if (MBSTRG(script_encoding_list) != NULL) { free(MBSTRG(script_encoding_list)); } @@ -1272,7 +1272,7 @@ break; default: convert_to_string_ex(arg1); - if (!php_mb_parse_encoding_list(Z_STRVAL_PP(arg1), Z_STRLEN_PP(arg1), &list, &size, 0)) { + if (!php_mb_parse_encoding_list(Z_STRVAL_PP(arg1), Z_STRLEN_PP(arg1), &list, &size, 0 TSRMLS_CC)) { if (list) { efree(list); } @@ -2516,7 +2516,7 @@ if (_from_encodings) { list = NULL; size = 0; - php_mb_parse_encoding_list(_from_encodings, strlen(_from_encodings), &list, &size, 0); + php_mb_parse_encoding_list(_from_encodings, strlen(_from_encodings), &list, &size, 0 TSRMLS_CC); if (size == 1) { from_encoding = *list; string.no_encoding = from_encoding; @@ -2747,7 +2747,7 @@ break; default: convert_to_string_ex(arg_list); - if (!php_mb_parse_encoding_list(Z_STRVAL_PP(arg_list), Z_STRLEN_PP(arg_list), &list, &size, 0)) { + if (!php_mb_parse_encoding_list(Z_STRVAL_PP(arg_list), Z_STRLEN_PP(arg_list), &list, &size, 0 TSRMLS_CC)) { if (list) { efree(list); size = 0; @@ -3045,7 +3045,7 @@ break; default: convert_to_string_ex(args[1]); - php_mb_parse_encoding_list(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1]), &elist, &elistsz, 0); + php_mb_parse_encoding_list(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1]), &elist, &elistsz, 0 TSRMLS_CC); break; } if (elistsz <= 0) { @@ -3637,9 +3637,10 @@ /* }}} */ /* {{{ 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 +MBSTRING_API int php_mb_gpc_encoding_converter(char **str, int *len, int num, const char *encoding_to, const char *encoding_from TSRMLS_DC) { + int i; mbfl_string string, result, *ret; enum mbfl_no_encoding from_encoding, to_encoding; mbfl_buffer_converter *convd; @@ -3663,49 +3664,69 @@ from_encoding = MBSTRG(http_input_identify); } + if (from_encoding == mbfl_no_encoding_pass) { + return 0; + } + /* 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); + for (i=0; i<num; i++) { + string.val = (char*)str[i]; + string.len = len[i]; - /* do it */ - ret = mbfl_buffer_converter_feed_result(convd, &string, &result TSRMLS_CC); - if (ret != NULL) { - efree(*str); - *str = ret->val; - *len = ret->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[i]); + str[i] = ret->val; + len[i] = ret->len; + } + mbfl_buffer_converter_delete(convd TSRMLS_CC); } - 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) +MBSTRING_API int php_mb_gpc_encoding_detector(char **arg_string, int *arg_length, int num, char *arg_list TSRMLS_DC) { mbfl_string string; enum mbfl_no_encoding *elist; enum mbfl_no_encoding encoding; + mbfl_encoding_detector *identd = NULL; int size, *list; + if (MBSTRG(http_input_list_size) == 1 && + MBSTRG(http_input_list)[0] == mbfl_no_encoding_pass) { + MBSTRG(http_input_identify) = mbfl_no_encoding_pass; + return SUCCESS; + } + + if (MBSTRG(http_input_list_size) == 1 && + MBSTRG(http_input_list)[0] != mbfl_no_encoding_auto && + mbfl_no_encoding2name(MBSTRG(http_input_list)[0]) != NULL) { + MBSTRG(http_input_identify) = MBSTRG(http_input_list)[0]; + return SUCCESS; + } + 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); + php_mb_parse_encoding_list(arg_list, strlen(arg_list), &list, &size, 0 TSRMLS_CC); if (size > 0 && list != NULL) { elist = list; @@ -3728,9 +3749,23 @@ 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); + + identd = mbfl_encoding_detector_new(elist, size); + + if (identd) { + int n = 0; + while (n < num) { + string.val = (unsigned char*)arg_string[n]; + string.len = arg_length[n]; + if (mbfl_encoding_detector_feed(identd, &string)) { + break; + } + n++; + } + encoding = mbfl_encoding_detector_judge(identd); + mbfl_encoding_detector_delete(identd); + } + if (encoding != mbfl_no_encoding_invalid) { MBSTRG(http_input_identify) = encoding; return SUCCESS; @@ -3812,7 +3847,7 @@ /* make encoding list */ list = NULL; size = 0; - php_mb_parse_encoding_list(arg_list, strlen(arg_list), &list, &size, 0); + php_mb_parse_encoding_list(arg_list, strlen(arg_list), &list, &size, 0 TSRMLS_CC); if (size <= 0) { return NULL; } Index: php-src/ext/mbstring/mbstring.h diff -u php-src/ext/mbstring/mbstring.h:1.40.2.7 php-src/ext/mbstring/mbstring.h:1.40.2.8 --- php-src/ext/mbstring/mbstring.h:1.40.2.7 Thu Jul 3 11:39:51 2003 +++ php-src/ext/mbstring/mbstring.h Sat Oct 25 06:30:50 2003 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mbstring.h,v 1.40.2.7 2003/07/03 15:39:51 moriyoshi Exp $ */ +/* $Id: mbstring.h,v 1.40.2.8 2003/10/25 10:30:50 hirokawa Exp $ */ /* * PHP4 Multibyte String module "mbstring" (currently only for Japanese) @@ -142,9 +142,9 @@ MBSTRING_API int php_mb_encoding_converter_ex(char **str, int *len, const char *encoding_to, const char *encoding_from TSRMLS_DC); -MBSTRING_API int php_mb_gpc_encoding_converter(char **str, int *len, const char *encoding_to, const char *encoding_from TSRMLS_DC); +MBSTRING_API int php_mb_gpc_encoding_converter(char **str, int *len, int num, const char *encoding_to, const char *encoding_from TSRMLS_DC); -MBSTRING_API int php_mb_gpc_encoding_detector(const char *arg_string, int arg_length, char *arg_list TSRMLS_DC); +MBSTRING_API int php_mb_gpc_encoding_detector(char **arg_string, int *arg_length, int num, char *arg_list 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.12 php-src/main/rfc1867.c:1.122.2.13 --- php-src/main/rfc1867.c:1.122.2.12 Mon Aug 4 21:01:40 2003 +++ php-src/main/rfc1867.c Sat Oct 25 06:30:51 2003 @@ -16,7 +16,7 @@ | Jani Taskinen <sniper@php.net> | +----------------------------------------------------------------------+ */ -/* $Id: rfc1867.c,v 1.122.2.12 2003/08/05 01:01:40 iliaa Exp $ */ +/* $Id: rfc1867.c,v 1.122.2.13 2003/10/25 10:30:51 hirokawa Exp $ */ /* * This product includes software developed by the Apache Group @@ -32,11 +32,66 @@ #include "php_variables.h" #include "rfc1867.h" +#undef DEBUG_FILE_UPLOAD + + #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) #include "ext/mbstring/mbstring.h" -#endif -#undef DEBUG_FILE_UPLOAD +static void safe_php_register_variable(char *var, char *strval, zval *track_vars_array, zend_bool override_protection TSRMLS_DC); + +#define SAFE_RETURN { \ + php_mb_flush_gpc_variables(num_vars, val_list, len_list, array_ptr TSRMLS_CC); \ + if (lbuf) efree(lbuf); \ + if (abuf) efree(abuf); \ + if (array_index) efree(array_index); \ + zend_hash_destroy(&PG(rfc1867_protected_variables)); \ + zend_llist_destroy(&header); \ + if (mbuff->boundary_next) efree(mbuff->boundary_next); \ + if (mbuff->boundary) efree(mbuff->boundary); \ + if (mbuff->buffer) efree(mbuff->buffer); \ + if (mbuff) efree(mbuff); \ + return; } + +void php_mb_flush_gpc_variables(int num_vars, char **val_list, int *len_list, zval *array_ptr TSRMLS_DC) +{ + int i; + if (php_mb_encoding_translation(TSRMLS_C)) { + if (num_vars > 0 && + php_mb_gpc_encoding_detector(val_list, len_list, num_vars, NULL TSRMLS_CC) == SUCCESS) { + php_mb_gpc_encoding_converter(val_list, len_list, num_vars, NULL, NULL TSRMLS_CC); + } + for (i=0; i<num_vars; i+=2){ + safe_php_register_variable(val_list[i], val_list[i+1], array_ptr, 0 TSRMLS_CC); + efree(val_list[i]); + efree(val_list[i+1]); + } + efree(val_list); + efree(len_list); + } +} + +void php_mb_gpc_stack_variable(char *param, char *value, char ***pval_list, int **plen_list, int *num_vars, int *num_vars_max TSRMLS_DC) +{ + char **val_list=*pval_list; + int *len_list=*plen_list; + + if (*num_vars>=*num_vars_max){ + (*num_vars_max) += 16; + *pval_list = (char **)erealloc(val_list, *num_vars_max*sizeof(char *)); + *plen_list = (int *)erealloc(len_list, *num_vars_max*sizeof(int)); + val_list=*pval_list; + len_list=*plen_list; + } + val_list[*num_vars] = (char *)estrdup(param); + len_list[*num_vars] = strlen(param); + (*num_vars)++; + val_list[*num_vars] = (char *)estrdup(value); + len_list[*num_vars] = strlen(value); + (*num_vars)++; +} + +#else #define SAFE_RETURN { \ if (lbuf) efree(lbuf); \ @@ -50,6 +105,7 @@ if (mbuff) efree(mbuff); \ return; } +#endif /* The longest property name we use in an uploaded file array */ #define MAX_SIZE_OF_INDEX sizeof("[tmp_name]") @@ -546,7 +602,8 @@ #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); + int len=strlen(str); + php_mb_gpc_encoding_detector(&str, &len, 1, NULL TSRMLS_CC); } #endif @@ -700,7 +757,8 @@ FILE *fp; zend_llist header; #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) - int str_len=0; + int str_len = 0, num_vars = 0, num_vars_max = 2*10+1, *len_list = NULL; + char **val_list = NULL; #endif if (SG(request_info).content_length > SG(post_max_size)) { @@ -751,6 +809,12 @@ INIT_PZVAL(http_post_files); PG(http_globals)[TRACK_VARS_FILES] = http_post_files; +#if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) + if (php_mb_encoding_translation(TSRMLS_C)) { + val_list = (char **)ecalloc(num_vars_max, sizeof(char *)); + len_list = (int *)ecalloc(num_vars_max, sizeof(int)); + } +#endif zend_llist_init(&header, sizeof(mime_header_entry), (llist_dtor_func_t) php_free_hdr_entry, 0); while (!multipart_buffer_eof(mbuff TSRMLS_CC)) @@ -812,13 +876,14 @@ #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); - } + php_mb_gpc_stack_variable(param, value, &val_list, &len_list, + &num_vars, &num_vars_max TSRMLS_CC); + } else { + safe_php_register_variable(param, value, array_ptr, 0 TSRMLS_CC); } -#endif +#else safe_php_register_variable(param, value, array_ptr, 0 TSRMLS_CC); +#endif if (!strcasecmp(param, "MAX_FILE_SIZE")) { max_file_size = atol(value); } @@ -944,11 +1009,15 @@ #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) { + val_list[num_vars] = filename; + len_list[num_vars] = strlen(filename); + num_vars++; + if(php_mb_gpc_encoding_detector(val_list, len_list, num_vars, NULL TSRMLS_CC) == SUCCESS) { str_len = strlen(filename); - php_mb_gpc_encoding_converter(&filename, &str_len, NULL, NULL TSRMLS_CC); + php_mb_gpc_encoding_converter(&filename, &str_len, 1, NULL, NULL TSRMLS_CC); } s = php_mb_strrchr(filename, '\\' TSRMLS_CC); + num_vars--; } else { s = strrchr(filename, '\\'); }
« previous php.cvs (#24244) next »