com php-src: Fixed bug #74431: NEWS ext/opcache/Optimizer/dfa _pass.c

[email protected] (Nikita Popov)
Newsgroups php.cvs
Message-ID <[email protected]>
Commit:    3ffe2cd251731d68493becf8ebbe6312ee86bb8d
Author:    Nikita Popov <[email protected]>         Fri, 14 Apr 2017 21:58:35 +0200
Parents:   5d095f80c9348ec4948f9024236eadafb46ff6b5
Branches:  PHP-7.1 master

Link:       http://git.php.net/?p=php-src.git;a=commitdiff;h=3ffe2cd251731d68493becf8ebbe6312ee86bb8d

Log:
Fixed bug #74431

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.

Bugs:
https://bugs.php.net/74431

Changed paths:
  M  NEWS
  M  ext/opcache/Optimizer/dfa_pass.c


Diff:
diff --git a/NEWS b/NEWS
index 29b5d08..9953a67 100644
--- 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)
diff --git a/ext/opcache/Optimizer/dfa_pass.c b/ext/opcache/Optimizer/dfa_pass.c
index 55915e7..4e42606 100644
--- a/ext/opcache/Optimizer/dfa_pass.c
+++ b/ext/opcache/Optimizer/dfa_pass.c
@@ -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:
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.