stas Fri Apr 13 00:42:48 2007 UTC Modified files: (Branch: PHP_4_4) /php-src/main rfc1867.c php_variables.c Log: fix for #38236 (patch by [EMAIL PROTECTED]) http://cvs.php.net/viewvc.cgi/php-src/main/rfc1867.c?r1=1.122.2.34.2.3&r2=1.122.2.34.2.4&diff_format=u Index: php-src/main/rfc1867.c diff -u php-src/main/rfc1867.c:1.122.2.34.2.3 php-src/main/rfc1867.c:1.122.2.34.2.4 --- php-src/main/rfc1867.c:1.122.2.34.2.3 Mon Jan 1 09:46:50 2007 +++ php-src/main/rfc1867.c Fri Apr 13 00:42:48 2007 @@ -16,7 +16,7 @@ | Jani Taskinen <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: rfc1867.c,v 1.122.2.34.2.3 2007/01/01 09:46:50 sebastian Exp $ */ +/* $Id: rfc1867.c,v 1.122.2.34.2.4 2007/04/13 00:42:48 stas Exp $ */ /* * This product includes software developed by the Apache Group @@ -37,7 +37,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); #define SAFE_RETURN { \ php_mb_flush_gpc_variables(num_vars, val_list, len_list, array_ptr TSRMLS_CC); \ @@ -61,7 +61,7 @@ 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); + safe_php_register_variable(val_list[i], val_list[i+1], len_list[i+1], array_ptr, 0 TSRMLS_CC); efree(val_list[i]); efree(val_list[i+1]); } @@ -215,10 +215,10 @@ } -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) { if (override_protection || !is_protected_variable(var TSRMLS_CC)) { - php_register_variable(var, strval, track_vars_array TSRMLS_CC); + php_register_variable_safe(var, strval, val_len, track_vars_array TSRMLS_CC); } } @@ -236,7 +236,7 @@ int register_globals = PG(register_globals); PG(register_globals) = 0; - safe_php_register_variable(strvar, val, http_post_files, override_protection TSRMLS_CC); + safe_php_register_variable(strvar, val, strlen(val), http_post_files, override_protection TSRMLS_CC); PG(register_globals) = register_globals; } @@ -749,7 +749,7 @@ XXX: this is horrible memory-usage-wise, but we only expect to do this on small pieces of form data. */ -static char *multipart_buffer_read_body(multipart_buffer *self TSRMLS_DC) +static char *multipart_buffer_read_body(multipart_buffer *self, unsigned int *len TSRMLS_DC) { char buf[FILLUNIT], *out=NULL; int total_bytes=0, read_bytes=0; @@ -761,6 +761,7 @@ } if (out) out[total_bytes] = '\0'; + *len = total_bytes; return out; } @@ -895,8 +896,8 @@ /* Normal form variable, safe to read all data into memory */ if (!filename && param) { - - char *value = multipart_buffer_read_body(mbuff TSRMLS_CC); + unsigned int value_len; + char *value = multipart_buffer_read_body(mbuff, &value_len TSRMLS_CC); if (!value) { value = estrdup(""); @@ -907,10 +908,10 @@ 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); + safe_php_register_variable(param, value, value_len, array_ptr, 0 TSRMLS_CC); } #else - safe_php_register_variable(param, value, array_ptr, 0 TSRMLS_CC); + safe_php_register_variable(param, value, value_len, array_ptr, 0 TSRMLS_CC); #endif if (!strcasecmp(param, "MAX_FILE_SIZE")) { max_file_size = atol(value); @@ -1104,9 +1105,9 @@ filedone: #endif if (s && s > 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); } /* Add $foo[name] */ @@ -1140,7 +1141,7 @@ } else { sprintf(lbuf, "%s_type", param); } - 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] */ if (is_arr_upload) { @@ -1162,7 +1163,7 @@ magic_quotes_gpc = PG(magic_quotes_gpc); PG(magic_quotes_gpc) = 0; /* if param is of form xxx[.*] this will cut it to xxx */ - 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] */ if (is_arr_upload) { http://cvs.php.net/viewvc.cgi/php-src/main/php_variables.c?r1=1.45.2.13.2.9&r2=1.45.2.13.2.10&diff_format=u Index: php-src/main/php_variables.c diff -u php-src/main/php_variables.c:1.45.2.13.2.9 php-src/main/php_variables.c:1.45.2.13.2.10 --- php-src/main/php_variables.c:1.45.2.13.2.9 Mon Mar 26 11:19:37 2007 +++ php-src/main/php_variables.c Fri Apr 13 00:42:48 2007 @@ -16,7 +16,7 @@ | Zeev Suraski <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_variables.c,v 1.45.2.13.2.9 2007/03/26 11:19:37 tony2001 Exp $ */ +/* $Id: php_variables.c,v 1.45.2.13.2.10 2007/04/13 00:42:48 stas Exp $ */ #include <stdio.h> #include "php.h" @@ -225,27 +225,33 @@ 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; if (SG(request_info).post_data==NULL) { return; } - 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 */ int 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)); php_register_variable_safe(var, val, val_len, array_ptr TSRMLS_CC); } - var = php_strtok_r(NULL, "&", &strtok_buf); + s = p + 1; + } + if (s < e) { + p = e; + goto last_value; } }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php