]> granicus.if.org Git - php/commitdiff
Fixed bug #74431
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 14 Apr 2017 19:58:35 +0000 (21:58 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 14 Apr 2017 20:03:06 +0000 (22:03 +0200)
If the last instruction in a block is a NOP, then `new_opline`
here won't be a copy of `opline`, it will be a copy of the last
non-NOP opline. Avoid performing a spurious update by explicitly
checking for NOP.

NEWS
ext/opcache/Optimizer/dfa_pass.c

diff --git a/NEWS b/NEWS
index 29b5d08fb0508bfdb8a7df3111e18181bbab85b1..9953a673164b36f8cc5470bf919c2dfa0a185e12 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -37,6 +37,9 @@ PHP                                                                        NEWS
     microseconds/fractions). (Andrew Nester)
   . Fixed bug #74433 (wrong reflection for Normalizer methods). (villfa)
 
+- Opcache:
+  . Fixed bug #74431 (foreach infinite loop). (Nikita)
+
 - OpenSSL:
   . Fixed bug #74341 (openssl_x509_parse fails to parse ASN.1 UTCTime without
     seconds). (Moritz Fain)
index 55915e70a945d6bdb8373f86c3f2db0b3b18cefc..4e4260660c0fadc556188239577c3bea9df00117 100644 (file)
@@ -162,8 +162,12 @@ static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa)
                                zend_op *opline;
                                zend_op *new_opline;
 
-                               opline = op_array->opcodes + end - 1;
                                b->len = target - b->start;
+                               opline = op_array->opcodes + end - 1;
+                               if (opline->opcode == ZEND_NOP) {
+                                       continue;
+                               }
+
                                new_opline = op_array->opcodes + target - 1;
                                switch (new_opline->opcode) {
                                        case ZEND_JMP: