summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/main.c56
-rw-r--r--main/php_globals.h3
-rw-r--r--main/php_variables.c2
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) {