iliaa Fri Jun 20 13:00:16 2003 EDT Modified files: (Branch: PHP_4_3) /php4/main main.c Log: Fixed bug #24253 (missing variables when register_globals is on) Fixed a memory leak when more then 1 E|S flag is passed to gpc_order. Fixed a memory leak when variables_order is not set and gpc_order has S|s flag. Optimized out duplicate parsing of the variables order string. Index: php4/main/main.c diff -u php4/main/main.c:1.512.2.41 php4/main/main.c:1.512.2.42 --- php4/main/main.c:1.512.2.41 Tue Jun 17 13:15:16 2003 +++ php4/main/main.c Fri Jun 20 13:00:16 2003 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: main.c,v 1.512.2.41 2003/06/17 17:15:16 iliaa Exp $ */ +/* $Id: main.c,v 1.512.2.42 2003/06/20 17:00:16 iliaa Exp $ */ /* {{{ includes */ @@ -134,7 +134,6 @@ #define NUM_TRACK_VARS (sizeof(short_track_vars_names_length)/sizeof(int)) - #define SAFE_FILENAME(f) ((f)?(f):"-") /* {{{ PHP_INI_MH @@ -1362,7 +1361,7 @@ static int php_hash_environment(TSRMLS_D) { char *p; - unsigned char _gpc_flags[3] = {0, 0, 0}; + int _gpc_flags[5] = {0, 0, 0, 0, 0}; zend_bool have_variables_order; zval *dummy_track_vars_array = NULL; zend_bool initialized_dummy_track_vars_array=0; @@ -1409,42 +1408,48 @@ case 'P': if (!_gpc_flags[0] && !SG(headers_sent) && SG(request_info).request_method && !strcmp(SG(request_info).request_method, "POST")) { sapi_module.treat_data(PARSE_POST, NULL, NULL TSRMLS_CC); /* POST Data */ - _gpc_flags[0]=1; + _gpc_flags[0]=TRACK_VARS_POST + 1; } break; case 'c': case 'C': if (!_gpc_flags[1]) { sapi_module.treat_data(PARSE_COOKIE, NULL, NULL TSRMLS_CC); /* Cookie Data */ - _gpc_flags[1]=1; + _gpc_flags[1]=TRACK_VARS_COOKIE + 1; } break; case 'g': case 'G': if (!_gpc_flags[2]) { sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC); /* GET Data */ - _gpc_flags[2]=1; + _gpc_flags[2]=TRACK_VARS_GET + 1; } break; case 'e': case 'E': - if (have_variables_order) { - ALLOC_ZVAL(PG(http_globals)[TRACK_VARS_ENV]); - array_init(PG(http_globals)[TRACK_VARS_ENV]); - INIT_PZVAL(PG(http_globals)[TRACK_VARS_ENV]); - php_import_environment_variables(PG(http_globals)[TRACK_VARS_ENV] TSRMLS_CC); - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported 'e' element (environment) used in gpc_order - use variables_order instead"); + if (!_gpc_flags[3]) { + if (have_variables_order) { + ALLOC_ZVAL(PG(http_globals)[TRACK_VARS_ENV]); + array_init(PG(http_globals)[TRACK_VARS_ENV]); + INIT_PZVAL(PG(http_globals)[TRACK_VARS_ENV]); + php_import_environment_variables(PG(http_globals)[TRACK_VARS_ENV] TSRMLS_CC); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported 'e' element (environment) used in gpc_order - use variables_order instead"); + } + _gpc_flags[3]=TRACK_VARS_ENV + 1; } break; case 's': case 'S': - php_register_server_variables(TSRMLS_C); + if (!_gpc_flags[4]) { + php_register_server_variables(TSRMLS_C); + _gpc_flags[4]=TRACK_VARS_SERVER + 1; + } break; } } - if (!have_variables_order) { + if (!have_variables_order && !PG(http_globals)[TRACK_VARS_SERVER]) { php_register_server_variables(TSRMLS_C); } @@ -1453,6 +1458,14 @@ php_build_argv(SG(request_info).query_string TSRMLS_CC); } + if (PG(register_globals)) { + for (i = 0; i < 5; i++) { + if (PG(http_globals)[i]) { + php_autoglobal_merge(&EG(symbol_table), Z_ARRVAL_P(PG(http_globals)[i]) TSRMLS_CC); + } + } + } + for (i=0; i<NUM_TRACK_VARS; i++) { if (!PG(http_globals)[i]) { if (!initialized_dummy_track_vars_array) { @@ -1478,39 +1491,12 @@ array_init(form_variables); INIT_PZVAL(form_variables); - for (p=variables_order; p && *p; p++) { - switch (*p) { - case 'g': - case 'G': - php_autoglobal_merge(Z_ARRVAL_P(form_variables), Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_GET]) TSRMLS_CC); - break; - case 'p': - case 'P': - php_autoglobal_merge(Z_ARRVAL_P(form_variables), Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_POST]) TSRMLS_CC); - break; - case 'c': - case 'C': - php_autoglobal_merge(Z_ARRVAL_P(form_variables), Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_COOKIE]) TSRMLS_CC); - break; - } - } - - if (PG(register_globals)) { - HashPosition pos; - zval **data; - char *string_key; - uint string_key_len; - ulong num_key; - - zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(form_variables), &pos); - while (zend_hash_get_current_data_ex(Z_ARRVAL_P(form_variables), (void **)&data, &pos) == SUCCESS) { - /* we only register string keys, since we cannot have $1234 */ - if (zend_hash_get_current_key_ex(Z_ARRVAL_P(form_variables), &string_key, &string_key_len, &num_key, 0, &pos) == HASH_KEY_IS_STRING) { - ZEND_SET_SYMBOL_WITH_LENGTH(&EG(symbol_table), string_key, string_key_len, *data, (*data)->refcount+1, 0); - } - zend_hash_move_forward_ex(Z_ARRVAL_P(form_variables), &pos); + for (i = 0; i < 3; i++) { + if (_gpc_flags[i]) { + php_autoglobal_merge(Z_ARRVAL_P(form_variables), Z_ARRVAL_P(PG(http_globals)[(_gpc_flags[i] - 1)]) TSRMLS_CC); } } + zend_hash_update(&EG(symbol_table), "_REQUEST", sizeof("_REQUEST"), &form_variables, sizeof(zval *), NULL); }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php