]> granicus.if.org Git - php/commitdiff
MFH: Fixed possible GLOBALS variable override when register_globals are ON.
authorIlia Alshanetsky <iliaa@php.net>
Wed, 28 Sep 2005 22:39:52 +0000 (22:39 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Wed, 28 Sep 2005 22:39:52 +0000 (22:39 +0000)
MFH: Fixed possible register_globals toggle via parse_str().
MFH: Fixed negative offset handling in substr_compare() function.

NEWS
ext/standard/string.c
main/php_variables.c

diff --git a/NEWS b/NEWS
index 7a055f9ce24468a3aa9e9ad19126cdc9f1c9e50a..2b5fe0c37ffc5bbbc972516425178570ee8ba53d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,9 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Aug 2005, PHP 5.1 Release Candidate 2
+- Fixed possible GLOBALS variable override when register_globals are ON.
+  (Ilia, Stefan)
+- Fixed possible register_globals toggle via parse_str(). (Ilia, Stefan)
 - Changed SQLite extension to be a shared module in Windows distribution.
   (Edin)
 - Changed "instanceof" and "catch" operators, is_a() and is_subclass_of()
index 347839b3f3310c5271775bd77eb3ec29d105f9e4..9ab31ba57f99cece92e70ba6117b2614d171fcaf 100644 (file)
@@ -3857,7 +3857,6 @@ PHP_FUNCTION(parse_str)
        zval *sarg;
        char *res = NULL;
        int argCount;
-       int old_rg;
 
        argCount = ZEND_NUM_ARGS();
        if (argCount < 1 || argCount > 2 || zend_get_parameters_ex(argCount, &arg, &arrayArg) == FAILURE) {
@@ -3870,19 +3869,18 @@ PHP_FUNCTION(parse_str)
                res = estrndup(Z_STRVAL_P(sarg), Z_STRLEN_P(sarg));
        }
 
-       old_rg = PG(register_globals);
        if (argCount == 1) {
-               PG(register_globals) = 1;
-               sapi_module.treat_data(PARSE_STRING, res, NULL TSRMLS_CC);
+               zval tmp;
+               Z_ARRVAL(tmp) = EG(active_symbol_table);
+
+               sapi_module.treat_data(PARSE_STRING, res, &tmp TSRMLS_CC);
        } else  {
-               PG(register_globals) = 0;
                /* Clear out the array that was passed in. */
                zval_dtor(*arrayArg);
                array_init(*arrayArg);
                
                sapi_module.treat_data(PARSE_STRING, res, *arrayArg TSRMLS_CC);
        }
-       PG(register_globals) = old_rg;
 }
 /* }}} */
 
@@ -4883,6 +4881,10 @@ PHP_FUNCTION(substr_compare)
                RETURN_FALSE;
        }
 
+       if (offset < 0) {
+               offset = s1_len + offset;
+       }
+
        cmp_len = (uint) (len ? len : MAX(s2_len, (s1_len - offset)));
 
        if (!cs) {
index 4479d6cc77fa3d71dba802d345e287e169770a78..a68abb0898dbfa71337d5bbfa42ebc413fb7d00a 100644 (file)
@@ -99,6 +99,13 @@ PHPAPI void php_register_variable_ex(char *var, zval *val, zval *track_vars_arra
                zval_dtor(val);
                return;
        }
+
+       /* GLOBALS hijack attempt, reject parameter */
+       if (symtable1 == EG(active_symbol_table) && !strcmp("GLOBALS", var)) {
+               zval_dtor(val);
+               return;
+       }
+
        /* ensure that we don't have spaces or dots in the variable name (not binary safe) */
        for (p=var; *p; p++) {
                switch (*p) {