]> granicus.if.org Git - php/commitdiff
Revert "Fix bug #72162 (again)"
authorXinchen Hui <laruence@gmail.com>
Fri, 6 May 2016 02:45:44 +0000 (10:45 +0800)
committerXinchen Hui <laruence@gmail.com>
Fri, 6 May 2016 02:45:44 +0000 (10:45 +0800)
The problem is because we release p->value too early

and later you try to convert an object to string, which is a fatal error

then leave p->value double free, change to expect long is a BC break

This reverts commit 8e5b38100411d3b8fa4486c7c41dec7dedb4b474.

Zend/zend_builtin_functions.c

index 7716d3e59b78b41017cec171b6ed1d0d0b99a7ed..558a1b2ac6ca7dfee3ef7b4be35850a1ec8f9ebc 100644 (file)
@@ -689,22 +689,23 @@ ZEND_FUNCTION(each)
    Return the current error_reporting level, and if an argument was passed - change to the new level */
 ZEND_FUNCTION(error_reporting)
 {
-       zend_long err;
+       zval *err;
        int old_error_reporting;
 
 #ifndef FAST_ZPP
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &err) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "|z", &err) == FAILURE) {
                return;
        }
 #else
        ZEND_PARSE_PARAMETERS_START(0, 1)
                Z_PARAM_OPTIONAL
-               Z_PARAM_LONG(err)
+               Z_PARAM_ZVAL(err)
        ZEND_PARSE_PARAMETERS_END();
 #endif
 
        old_error_reporting = EG(error_reporting);
        if (ZEND_NUM_ARGS() != 0) {
+               zend_string *new_val = zval_get_string(err);
                do {
                        zend_ini_entry *p = EG(error_reporting_ini_entry);
 
@@ -730,8 +731,12 @@ ZEND_FUNCTION(error_reporting)
                                zend_string_release(p->value);
                        }
 
-                       p->value = zend_long_to_str(err);
-                       EG(error_reporting) = err;
+                       p->value = new_val;
+                       if (Z_TYPE_P(err) == IS_LONG) {
+                               EG(error_reporting) = Z_LVAL_P(err);
+                       } else {
+                               EG(error_reporting) = atoi(ZSTR_VAL(p->value));
+                       }
                } while (0);
        }