From 97c0b133c560e81bafbedaa321216b8862e1bdfc Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 20 Jul 2016 16:59:14 +0800 Subject: [PATCH] Fixed bug #72629 (Caught exception assignment to variables ignores references). --- NEWS | 2 ++ Zend/tests/try/bug72629.phpt | 16 ++++++++++++++++ Zend/zend_vm_def.h | 8 ++++++-- Zend/zend_vm_execute.h | 8 ++++++-- ext/pgsql/tests/config.inc | 2 +- main/php_version.h | 6 +++--- 6 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 Zend/tests/try/bug72629.phpt diff --git a/NEWS b/NEWS index 6a42e1cf97..af9ce204ae 100644 --- a/NEWS +++ b/NEWS @@ -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-- +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 -- 2.50.1