]> granicus.if.org Git - php/commitdiff
Fixed bug #74444: multiple catch freezes in some cases
authorDavid Matejka <matej21@matej21.cz>
Fri, 14 Apr 2017 22:20:06 +0000 (00:20 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 14 Apr 2017 23:38:37 +0000 (01:38 +0200)
zend_emit_jump() may reallocate, so reload the opline.

NEWS
Zend/tests/try/bug74444.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/NEWS b/NEWS
index 6af7477ac665f9994f852ffedb2f985a40e03213..c8c57bef08c932cadc0f3273f6a46f136c82ec91 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@ PHP                                                                        NEWS
     (Nikita)
   . Fixed bug #74188 (Null coalescing operator fails for undeclared static
     class properties). (tpunt)
+  . Fixed bug #74444 (multiple catch freezes in some cases). (David Matějka)
 
 - Date:
   . Fixed bug #74404 (Wrong reflection on DateTimeZone::getTransitions).
diff --git a/Zend/tests/try/bug74444.phpt b/Zend/tests/try/bug74444.phpt
new file mode 100644 (file)
index 0000000..838d12e
--- /dev/null
@@ -0,0 +1,77 @@
+--TEST--
+Bug #74444 (multiple catch freezes in some cases)
+--FILE--
+<?php
+function foo()
+{
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       echo '';
+       try {
+               throw new \RuntimeException();
+       } catch (\FooEx  | \RuntimeException $e) {
+               echo 1;
+       }
+       echo 2;
+}
+
+foo();
+
+--EXPECT--
+12
index d1d8ddcb8adbf6c62043f19811efd20907957840..12e063008840494dfbb9726d0623335da46807ca 100644 (file)
@@ -4810,6 +4810,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
 
                        if (!is_last_class) {
                                jmp_multicatch[j] = zend_emit_jump(0);
+                               opline = &CG(active_op_array)->opcodes[opnum_catch];
                                opline->extended_value = get_next_op_number(CG(active_op_array));
                        }
                }