diff options
Diffstat (limited to 'main')
| -rw-r--r-- | main/main.c | 56 | ||||
| -rw-r--r-- | main/php_globals.h | 3 | ||||
| -rw-r--r-- | main/php_variables.c | 2 |
3 files changed, 37 insertions, 24 deletions
diff --git a/main/main.c b/main/main.c index 2c1789c385..5fb79f0702 100644 --- a/main/main.c +++ b/main/main.c @@ -97,7 +97,7 @@ static MUTEX_T global_lock; #endif -void _php_build_argv(char * ELS_DC); +static void php_build_argv(char *s, zval *track_vars_array ELS_DC PLS_DC); static void php_timeout(int dummy); static void php_set_timeout(long seconds); @@ -250,7 +250,8 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("track_vars", "0", PHP_INI_ALL, OnUpdateBool, track_vars, php_core_globals, core_globals) #endif - STD_PHP_INI_BOOLEAN("register_globals", "1", PHP_INI_ALL, OnUpdateBool, gpc_globals, php_core_globals, core_globals) + STD_PHP_INI_BOOLEAN("register_globals", "1", PHP_INI_ALL, OnUpdateBool, register_globals, php_core_globals, core_globals) + STD_PHP_INI_BOOLEAN("register_argc_argv", "1", PHP_INI_ALL, OnUpdateBool, register_argc_argv, php_core_globals, core_globals) STD_PHP_INI_ENTRY("gpc_order", "GPC", PHP_INI_ALL, OnUpdateStringUnempty, gpc_order, php_core_globals, core_globals) STD_PHP_INI_ENTRY("variables_order", NULL, PHP_INI_ALL, OnUpdateStringUnempty, variables_order, php_core_globals, core_globals) STD_PHP_INI_ENTRY("arg_separator", "&", PHP_INI_ALL, OnUpdateStringUnempty, arg_separator, php_core_globals, core_globals) @@ -1007,6 +1008,10 @@ static inline void php_register_server_variables(ELS_D SLS_DC PLS_DC) zend_hash_add(&EG(symbol_table), "HTTP_SERVER_VARS", sizeof("HTTP_SERVER_VARS"), &array_ptr, sizeof(pval *),NULL); } sapi_module.register_server_variables(array_ptr ELS_CC SLS_CC PLS_CC); + + if (PG(register_argc_argv)) { + php_build_argv(SG(request_info).query_string, array_ptr ELS_CC PLS_CC); + } } @@ -1070,30 +1075,21 @@ static int php_hash_environment(ELS_D SLS_DC PLS_DC) php_register_server_variables(ELS_C SLS_CC PLS_CC); } - - /* need argc/argv support as well */ - _php_build_argv(SG(request_info).query_string ELS_CC); - return SUCCESS; } -void _php_build_argv(char *s ELS_DC) +static void php_build_argv(char *s, zval *track_vars_array ELS_DC PLS_DC) { - pval *arr, *tmp; + pval *arr, *argc, *tmp; int count = 0; char *ss, *space; ALLOC_ZVAL(arr); - arr->value.ht = (HashTable *) emalloc(sizeof(HashTable)); - if (zend_hash_init(arr->value.ht, 0, NULL, ZVAL_PTR_DTOR, 0) == FAILURE) { - php_error(E_WARNING, "Unable to create argv array"); - } else { - arr->type = IS_ARRAY; - INIT_PZVAL(arr); - zend_hash_update(&EG(symbol_table), "argv", sizeof("argv"), &arr, sizeof(pval *), NULL); - } - /* now pick out individual entries */ + array_init(arr); + INIT_PZVAL(arr); + + /* Prepare argv */ ss = s; while (ss) { space = strchr(ss, '+'); @@ -1119,11 +1115,27 @@ void _php_build_argv(char *s ELS_DC) ss = space; } } - ALLOC_ZVAL(tmp); - tmp->value.lval = count; - tmp->type = IS_LONG; - INIT_PZVAL(tmp); - zend_hash_add(&EG(symbol_table), "argc", sizeof("argc"), &tmp, sizeof(pval *), NULL); + + /* prepare argc */ + ALLOC_ZVAL(argc); + argc->value.lval = count; + argc->type = IS_LONG; + INIT_PZVAL(argc); + + if (PG(register_globals)) { + zend_hash_update(&EG(symbol_table), "argv", sizeof("argv"), &arr, sizeof(pval *), NULL); + zend_hash_add(&EG(symbol_table), "argc", sizeof("argc"), &argc, sizeof(pval *), NULL); + } + + if (PG(track_vars)) { + if (!PG(register_globals)) { + arr->refcount++; + argc->refcount++; + } + zend_hash_update(&EG(symbol_table), "argv", sizeof("argv"), &arr, sizeof(pval *), NULL); + zend_hash_add(&EG(symbol_table), "argc", sizeof("argc"), &argc, sizeof(pval *), NULL); + } + } diff --git a/main/php_globals.h b/main/php_globals.h index 8bb5792c82..b6e086ced3 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -86,7 +86,8 @@ struct _php_core_globals { zend_bool expose_php; zend_bool track_vars; - zend_bool gpc_globals; + zend_bool register_globals; + zend_bool register_argc_argv; zend_bool y2k_compliance; diff --git a/main/php_variables.c b/main/php_variables.c index b4355b4ee8..383442ab66 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -40,7 +40,7 @@ PHPAPI void php_register_variable(char *val, char *var, pval *track_vars_array E HashTable *symtable1=NULL; HashTable *symtable2=NULL; - if (PG(gpc_globals)) { + if (PG(register_globals)) { symtable1 = EG(active_symbol_table); } if (track_vars_array) { |
