From: Nikita Popov Date: Mon, 25 Feb 2019 12:00:16 +0000 (+0100) Subject: Fix assertion in Exception::getMessage() if $message is a ref X-Git-Tag: php-7.3.4RC1~54^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=af37d58cf7b77814b93ea97a8dcd2afb46c4424e;p=php Fix assertion in Exception::getMessage() if $message is a ref And same for other properties. Encountered in Symfony. --- diff --git a/Zend/tests/exception_getters_with_ref_props.phpt b/Zend/tests/exception_getters_with_ref_props.phpt new file mode 100644 index 0000000000..d3dcd8326f --- /dev/null +++ b/Zend/tests/exception_getters_with_ref_props.phpt @@ -0,0 +1,30 @@ +--TEST-- +Calling exception getters when properties hold references +--FILE-- +message =& $refMsg; + $this->code =& $refCode; + $this->file =& $refFile; + $this->line =& $refLine; + } +} + +$refMsg = "foo"; +$refCode = 0; +$refFile = "foobar"; +$refLine = 42; +$ex = new MyException($refMsg, $refCode, $refFile, $refLine); +var_dump($ex->getMessage()); +var_dump($ex->getCode()); +var_dump($ex->getFile()); +var_dump($ex->getLine()); + +?> +--EXPECT-- +string(3) "foo" +int(0) +string(6) "foobar" +int(42) diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index b4deb29a72..486a5d3908 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -401,11 +401,13 @@ ZEND_METHOD(error_exception, __construct) Get the file in which the exception occurred */ ZEND_METHOD(exception, getFile) { - zval rv; + zval *prop, rv; DEFAULT_0_PARAMS; - ZVAL_COPY(return_value, GET_PROPERTY(getThis(), ZEND_STR_FILE)); + prop = GET_PROPERTY(getThis(), ZEND_STR_FILE); + ZVAL_DEREF(prop); + ZVAL_COPY(return_value, prop); } /* }}} */ @@ -413,11 +415,13 @@ ZEND_METHOD(exception, getFile) Get the line in which the exception occurred */ ZEND_METHOD(exception, getLine) { - zval rv; + zval *prop, rv; DEFAULT_0_PARAMS; - ZVAL_COPY(return_value, GET_PROPERTY(getThis(), ZEND_STR_LINE)); + prop = GET_PROPERTY(getThis(), ZEND_STR_LINE); + ZVAL_DEREF(prop); + ZVAL_COPY(return_value, prop); } /* }}} */ @@ -425,11 +429,13 @@ ZEND_METHOD(exception, getLine) Get the exception message */ ZEND_METHOD(exception, getMessage) { - zval rv; + zval *prop, rv; DEFAULT_0_PARAMS; - ZVAL_COPY(return_value, GET_PROPERTY(getThis(), ZEND_STR_MESSAGE)); + prop = GET_PROPERTY(getThis(), ZEND_STR_MESSAGE); + ZVAL_DEREF(prop); + ZVAL_COPY(return_value, prop); } /* }}} */ @@ -437,11 +443,13 @@ ZEND_METHOD(exception, getMessage) Get the exception code */ ZEND_METHOD(exception, getCode) { - zval rv; + zval *prop, rv; DEFAULT_0_PARAMS; - ZVAL_COPY(return_value, GET_PROPERTY(getThis(), ZEND_STR_CODE)); + prop = GET_PROPERTY(getThis(), ZEND_STR_CODE); + ZVAL_DEREF(prop); + ZVAL_COPY(return_value, prop); } /* }}} */ @@ -449,11 +457,13 @@ ZEND_METHOD(exception, getCode) Get the stack trace for the location in which the exception occurred */ ZEND_METHOD(exception, getTrace) { - zval rv; + zval *prop, rv; DEFAULT_0_PARAMS; - ZVAL_COPY(return_value, GET_PROPERTY(getThis(), ZEND_STR_TRACE)); + prop = GET_PROPERTY(getThis(), ZEND_STR_TRACE); + ZVAL_DEREF(prop); + ZVAL_COPY(return_value, prop); } /* }}} */ @@ -461,11 +471,13 @@ ZEND_METHOD(exception, getTrace) Get the exception severity */ ZEND_METHOD(error_exception, getSeverity) { - zval rv; + zval *prop, rv; DEFAULT_0_PARAMS; - ZVAL_COPY(return_value, GET_PROPERTY(getThis(), ZEND_STR_SEVERITY)); + prop = GET_PROPERTY(getThis(), ZEND_STR_SEVERITY); + ZVAL_DEREF(prop); + ZVAL_COPY(return_value, prop); } /* }}} */