summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2016-05-06 10:45:44 +0800
committerXinchen Hui <laruence@gmail.com>2016-05-06 10:45:44 +0800
commit441d1b8ef07c5dc7f5a7fada46d829eed21ed4bc (patch)
treef9b40dec4ceffaf4b35a552cc6a19b96f025039e
parent8e5b38100411d3b8fa4486c7c41dec7dedb4b474 (diff)
downloadphp-git-441d1b8ef07c5dc7f5a7fada46d829eed21ed4bc.tar.gz
Revert "Fix bug #72162 (again)"
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.
-rw-r--r--Zend/zend_builtin_functions.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 7716d3e59b..558a1b2ac6 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -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);
}