]> granicus.if.org Git - php/commitdiff
Add test for memory leak with wrong return type
authorBob Weinand <bobwei9@hotmail.com>
Tue, 26 May 2015 23:37:00 +0000 (01:37 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Tue, 26 May 2015 23:37:00 +0000 (01:37 +0200)
Zend/tests/return_types/028.phpt [new file with mode: 0644]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/return_types/028.phpt b/Zend/tests/return_types/028.phpt
new file mode 100644 (file)
index 0000000..d820b25
--- /dev/null
@@ -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
index 55b72e90d7d6d687d0a07346c4d58a5f0dd9697b..c71fbc9734e1b2e2fa47137fdb6afdc792bcd9d1 100644 (file)
@@ -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
index 1119dca1a2911699073b802b7fd28741d1020e98..a38d7db860f6d46b3717f7f40a4508d60e4fe2d6 100644 (file)
@@ -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