com php-src: Add test for memory leak with wrong return type: Zend/tests/return_types/028.phpt Zend/zend_vm_d ef.h Zend/zend_vm_execute.h
| From: | Bob Weinand | Date: | Tue, 26 May 2015 23:37:00 +0000 |
| Subject: | com php-src: Add test for memory leak with wrong return type: Zend/tests/return_types/028.phpt Zend/zend_vm_d ef.h Zend/zend_vm_execute.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-86941@lists.php.net to get a copy of this message | ||
Commit: b73f87b1e49a383cce40e5fe295300c89128dbe2
Author: Bob Weinand <bobwei9@hotmail.com> Wed, 27 May 2015 01:37:00 +0200
Parents: f7f7d6e385e91f70ee640018fd155dbd035a2e53
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=b73f87b1e49a383cce40e5fe295300c89128dbe2
Log:
Add test for memory leak with wrong return type
Changed paths:
A Zend/tests/return_types/028.phpt
M Zend/zend_vm_def.h
M Zend/zend_vm_execute.h
Diff:
diff --git a/Zend/tests/return_types/028.phpt b/Zend/tests/return_types/028.phpt
new file mode 100644
index 0000000..d820b25
--- /dev/null
+++ b/Zend/tests/return_types/028.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Memory leak when returning TMP/VAR with wrong return type
+--FILE--
+<?php
+
+function foo(): stdClass {
+ $a = new stdClass;
+ $b = [];
+ return [$a, $b];
+}
+
+try {
+ foo();
+} catch (BaseException $e) {
+ print $e->getMessage();
+}
+
+?>
+--EXPECTF--
+Return value of foo() must be an instance of stdClass, array returned in %s on line %d
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 55b72e9..c71fbc9 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -3909,7 +3909,8 @@ ZEND_VM_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV, UNUSED)
}
}
zend_verify_return_type(EX(func), retval_ptr);
- if (EG(exception)) {
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
FREE_OP1();
}
#endif
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 1119dca..a38d7db 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -7815,7 +7815,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_
}
}
zend_verify_return_type(EX(func), retval_ptr);
- if (EG(exception)) {
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
}
#endif
@@ -13440,7 +13441,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UN
}
}
zend_verify_return_type(EX(func), retval_ptr);
- if (EG(exception)) {
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor_nogc(free_op1);
}
#endif
@@ -19201,7 +19203,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UN
}
}
zend_verify_return_type(EX(func), retval_ptr);
- if (EG(exception)) {
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor_nogc(free_op1);
}
#endif
@@ -25149,7 +25152,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED
}
}
zend_verify_return_type(EX(func), retval_ptr);
- if (EG(exception)) {
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
}
#endif
@@ -34798,7 +34802,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNU
}
}
zend_verify_return_type(EX(func), retval_ptr);
- if (EG(exception)) {
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
}
#endif