diff --git a/main/php_variables.c b/main/php_variables.c index 5ebf1681745..ad926bd6318 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -341,8 +341,7 @@ plain_var: SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler) { - char *var, *val; - char *strtok_buf = NULL; + char *var, *val, *e, *s, *p; zval *array_ptr = (zval *) arg; UConverter *input_conv = UG(http_input_encoding_conv); @@ -354,11 +353,12 @@ SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler) input_conv = ZEND_U_CONVERTER(UG(output_encoding_conv)); } - var = php_strtok_r(SG(request_info).post_data, "&", &strtok_buf); + s = SG(request_info).post_data; + e = s + SG(request_info).post_data_length; - while (var) { - val = strchr(var, '='); - if (val) { /* have a value */ + while (s < e && (p = memchr(s, '&', (e - s)))) { +last_value: + if ((val = memchr(s, '=', (p - s)))) { /* have a value */ if (UG(unicode)) { UChar *u_var, *u_val; int u_var_len, u_val_len; @@ -366,10 +366,12 @@ SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler) int val_len; UErrorCode status1 = U_ZERO_ERROR, status2 = U_ZERO_ERROR; - *val++ = '\0'; - var_len = strlen(var); + var = s; + var_len = val - s; + php_url_decode(var, var_len); - val_len = php_url_decode(val, strlen(val)); + val++; + val_len = php_url_decode(val, (p - val)); zend_convert_to_unicode(input_conv, &u_var, &u_var_len, var, var_len, &status1); zend_convert_to_unicode(input_conv, &u_val, &u_val_len, val, val_len, &status2); if (U_SUCCESS(status1) && U_SUCCESS(status2)) { @@ -383,9 +385,11 @@ SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler) } else { unsigned int val_len, new_val_len; - *val++ = '\0'; - php_url_decode(var, strlen(var)); - val_len = php_url_decode(val, strlen(val)); + var = s; + + php_url_decode(var, (val - s)); + val++; + val_len = php_url_decode(val, (p - val)); val = estrndup(val, val_len); if (sapi_module.input_filter(PARSE_POST, var, &val, val_len, &new_val_len TSRMLS_CC)) { php_register_variable_safe(var, val, new_val_len, array_ptr TSRMLS_CC); @@ -393,7 +397,11 @@ SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler) efree(val); } } - var = php_strtok_r(NULL, "&", &strtok_buf); + s = p + 1; + } + if (s < e) { + p = e; + goto last_value; } } diff --git a/main/rfc1867.c b/main/rfc1867.c index cbe494f5ac7..081a5f94666 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -50,7 +50,7 @@ #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) #include "ext/mbstring/mbstring.h" -static void safe_php_register_variable(char *var, char *strval, zval *track_vars_array, zend_bool override_protection TSRMLS_DC); +static void safe_php_register_variable(char *var, char *strval, int val_len, zval *track_vars_array, zend_bool override_protection TSRMLS_DC); void php_mb_flush_gpc_variables(int num_vars, char **val_list, int *len_list, zval *array_ptr TSRMLS_DC) { @@ -61,7 +61,7 @@ void php_mb_flush_gpc_variables(int num_vars, char **val_list, int *len_list, zv php_mb_gpc_encoding_converter(val_list, len_list, num_vars, NULL, NULL TSRMLS_CC); } for (i=0; i filename) { - safe_php_register_variable(lbuf, s+1, NULL, 0 TSRMLS_CC); + safe_php_register_variable(lbuf, s+1, strlen(s+1), NULL, 0 TSRMLS_CC); } else { - safe_php_register_variable(lbuf, filename, NULL, 0 TSRMLS_CC); + safe_php_register_variable(lbuf, filename, strlen(filename), NULL, 0 TSRMLS_CC); } } @@ -1852,7 +1854,7 @@ filedone: sprintf(lbuf, "%s_type", param); } if (!is_anonymous) { - safe_php_register_variable(lbuf, cd, NULL, 0 TSRMLS_CC); + safe_php_register_variable(lbuf, cd, strlen(cd), NULL, 0 TSRMLS_CC); } /* Add $foo[type] */ @@ -1874,7 +1876,7 @@ filedone: /* if param is of form xxx[.*] this will cut it to xxx */ if (!is_anonymous) { - safe_php_register_variable(param, temp_filename, NULL, 1 TSRMLS_CC); + safe_php_register_variable(param, temp_filename, strlen(temp_filename), NULL, 1 TSRMLS_CC); } /* Add $foo[tmp_name] */