summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS6
-rw-r--r--ext/opcache/Optimizer/zend_inference.c4
-rw-r--r--ext/opcache/tests/bug73668.phpt8
3 files changed, 17 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index b13acb9291..8f07727f47 100644
--- a/NEWS
+++ b/NEWS
@@ -2,10 +2,14 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 2017, PHP 7.1.1
-- Opcache:
+- Core:
. Fixed bug #73663 ("Invalid opcode 65/16/8" occurs with a variable created
with list()). (Laruence)
+
+- Opcache:
. Fixed bug #73654 (Segmentation fault in zend_call_function). (Nikita)
+ . Fixed bug #73668 ("SIGFPE Arithmetic exception" in opcache when divide by
+ minus 1). (Nikita)
01 Dec 2016, PHP 7.1.0
diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c
index 24be5c3a27..062f8c6696 100644
--- a/ext/opcache/Optimizer/zend_inference.c
+++ b/ext/opcache/Optimizer/zend_inference.c
@@ -610,6 +610,10 @@ static int zend_inference_calc_binary_op_range(
if (op2_min <= 0 && op2_max >= 0) {
break;
}
+ if (op1_min == ZEND_LONG_MIN && op2_max == -1) {
+ /* Avoid ill-defined division, which may trigger SIGFPE. */
+ break;
+ }
t1 = op1_min / op2_min;
t2 = op1_min / op2_max;
t3 = op1_max / op2_min;
diff --git a/ext/opcache/tests/bug73668.phpt b/ext/opcache/tests/bug73668.phpt
new file mode 100644
index 0000000000..aac5c9e65c
--- /dev/null
+++ b/ext/opcache/tests/bug73668.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Bug #73668: "SIGFPE Arithmetic exception" in opcache when divide by minus 1
+--FILE--
+<?php
+$a/-1;
+?>
+--EXPECTF--
+Notice: Undefined variable: a in %s on line %d