diff options
author | Xinchen Hui <laruence@gmail.com> | 2016-07-20 16:59:14 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2016-07-20 16:59:14 +0800 |
commit | 97c0b133c560e81bafbedaa321216b8862e1bdfc (patch) | |
tree | 58462d278b69fa0a0b0fd27542c2ad80d75935c8 | |
parent | 3c3b8c8365dc9ac7d62034c9eecbabb4800b7353 (diff) | |
download | php-git-97c0b133c560e81bafbedaa321216b8862e1bdfc.tar.gz |
Fixed bug #72629 (Caught exception assignment to variables ignores references).
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | Zend/tests/try/bug72629.phpt | 16 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 8 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 8 | ||||
-rw-r--r-- | ext/pgsql/tests/config.inc | 2 | ||||
-rw-r--r-- | main/php_version.h | 6 |
6 files changed, 34 insertions, 8 deletions
@@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2016 PHP 7.0.10 - Core: + . Fixed bug #72629 (Caught exception assignment to variables ignores + references). (Laruence) . Fixed bug #72594 (Calling an earlier instance of an included anonymous class fatals). (Laruence) . Fixed bug #72581 (previous property undefined in Exception after diff --git a/Zend/tests/try/bug72629.phpt b/Zend/tests/try/bug72629.phpt new file mode 100644 index 0000000000..2d596c78f8 --- /dev/null +++ b/Zend/tests/try/bug72629.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #72629 (Caught exception assignment to variables ignores references) +--FILE-- +<?php + +$var = null; +$e = &$var; + +try { + throw new Exception; +} catch (Exception $e) { } + +var_dump($var === $e); + +--EXPECT-- +bool(true) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e73234a21c..3938445321 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4154,6 +4154,7 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV) USE_OPLINE zend_class_entry *ce, *catch_ce; zend_object *exception; + zval *ex; SAVE_OPLINE(); /* Check whether an exception has been thrown, if not, jump over code */ @@ -4188,8 +4189,11 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV) } exception = EG(exception); - zval_ptr_dtor(EX_VAR(opline->op2.var)); - ZVAL_OBJ(EX_VAR(opline->op2.var), EG(exception)); + ex = EX_VAR(opline->op2.var); + if (UNEXPECTED(Z_ISREF_P(ex))) { + ex = Z_REFVAL_P(ex); + } + ZVAL_OBJ(ex, EG(exception)); if (UNEXPECTED(EG(exception) != exception)) { GC_REFCOUNT(EG(exception))++; HANDLE_EXCEPTION(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 04ff3ebf2a..08a5ae622d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -9553,6 +9553,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZE USE_OPLINE zend_class_entry *ce, *catch_ce; zend_object *exception; + zval *ex; SAVE_OPLINE(); /* Check whether an exception has been thrown, if not, jump over code */ @@ -9587,8 +9588,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZE } exception = EG(exception); - zval_ptr_dtor(EX_VAR(opline->op2.var)); - ZVAL_OBJ(EX_VAR(opline->op2.var), EG(exception)); + ex = EX_VAR(opline->op2.var); + if (UNEXPECTED(Z_ISREF_P(ex))) { + ex = Z_REFVAL_P(ex); + } + ZVAL_OBJ(ex, EG(exception)); if (UNEXPECTED(EG(exception) != exception)) { GC_REFCOUNT(EG(exception))++; HANDLE_EXCEPTION(); diff --git a/ext/pgsql/tests/config.inc b/ext/pgsql/tests/config.inc index e9944de793..7be1e242ad 100644 --- a/ext/pgsql/tests/config.inc +++ b/ext/pgsql/tests/config.inc @@ -5,7 +5,7 @@ // environment var PGSQL_TEST_CONNSTR // "test" database must exist. i.e. "createdb test" before testing -$conn_str = getenv('PGSQL_TEST_CONNSTR') ?: "host=localhost dbname=test port=5432"; // connection string +$conn_str = getenv('PGSQL_TEST_CONNSTR') ?: "host=localhost dbname=test port=5432 user=postgres password=postgres"; // connection string $table_name = "php_pgsql_test"; // test table that will be created $table_name_92 = "php_pgsql_test_92"; // test table that will be created diff --git a/main/php_version.h b/main/php_version.h index b69e1adada..00021c119b 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 7 #define PHP_MINOR_VERSION 0 -#define PHP_RELEASE_VERSION 10 +#define PHP_RELEASE_VERSION 7 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "7.0.10-dev" -#define PHP_VERSION_ID 70010 +#define PHP_VERSION "7.0.7-dev" +#define PHP_VERSION_ID 70007 |