]> granicus.if.org Git - php/commitdiff
Fix assertion in Exception::getMessage() if $message is a ref
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 25 Feb 2019 12:00:16 +0000 (13:00 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 25 Feb 2019 12:00:16 +0000 (13:00 +0100)
And same for other properties. Encountered in Symfony.

Zend/tests/exception_getters_with_ref_props.phpt [new file with mode: 0644]
Zend/zend_exceptions.c

diff --git a/Zend/tests/exception_getters_with_ref_props.phpt b/Zend/tests/exception_getters_with_ref_props.phpt
new file mode 100644 (file)
index 0000000..d3dcd83
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+Calling exception getters when properties hold references
+--FILE--
+<?php
+
+class MyException extends Exception {
+    public function __construct(&$refMsg, &$refCode, &$refFile, &$refLine) {
+        $this->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)
index b4deb29a720100761bc8156ed37e94e30d099f42..486a5d39080a4a4039fc76381770edb90e21405b 100644 (file)
@@ -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);
 }
 /* }}} */