summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2016-07-20 16:59:14 +0800
committerXinchen Hui <laruence@gmail.com>2016-07-20 16:59:14 +0800
commit97c0b133c560e81bafbedaa321216b8862e1bdfc (patch)
tree58462d278b69fa0a0b0fd27542c2ad80d75935c8
parent3c3b8c8365dc9ac7d62034c9eecbabb4800b7353 (diff)
downloadphp-git-97c0b133c560e81bafbedaa321216b8862e1bdfc.tar.gz
Fixed bug #72629 (Caught exception assignment to variables ignores references).
-rw-r--r--NEWS2
-rw-r--r--Zend/tests/try/bug72629.phpt16
-rw-r--r--Zend/zend_vm_def.h8
-rw-r--r--Zend/zend_vm_execute.h8
-rw-r--r--ext/pgsql/tests/config.inc2
-rw-r--r--main/php_version.h6
6 files changed, 34 insertions, 8 deletions
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--
+<?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