]> granicus.if.org Git - php/commitdiff
Fixed bug #74408 (Endless loop bypassing execution time limit)
authorXinchen Hui <laruence@gmail.com>
Tue, 11 Apr 2017 10:46:16 +0000 (18:46 +0800)
committerXinchen Hui <laruence@gmail.com>
Tue, 11 Apr 2017 10:46:16 +0000 (18:46 +0800)
NEWS
Zend/tests/bug74408.phpt [new file with mode: 0644]
Zend/zend_execute_API.c

diff --git a/NEWS b/NEWS
index dd25136a0047e9cc6c19fa2280cc8df9f3aebb1c..889fd1d3195447c6dd21380b7ee6483605daddb5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,9 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2017 PHP 7.0.19
 
+- Core:
+  . Fixed bug #74408 (Endless loop bypassing execution time limit). (Laruence)
+
 - Date:
   . Fixed bug #74404 (Wrong reflection on DateTimeZone::getTransitions).
     (krakjoe)
diff --git a/Zend/tests/bug74408.phpt b/Zend/tests/bug74408.phpt
new file mode 100644 (file)
index 0000000..c0cf2f8
--- /dev/null
@@ -0,0 +1,38 @@
+--TEST--
+Bug #74408 (Endless loop bypassing execution time limit)
+--INI--
+error_reporting = E_ALL | E_DEPRECATED | E_STRICT
+--FILE--
+<?php
+
+ //php.ini: error_reporting = E_ALL | E_DEPRECATED | E_STRICT
+
+ class ErrorHandling {
+
+  public  function error_handler($errno, $errstr, $errfile, $errline) {
+         $bla = new NonExistingClass2();
+  }
+
+  public function exception_handler(Error $e) { 
+         echo "Caught, exception: " . $e->getMessage();
+  }
+ }
+
+ set_error_handler('ErrorHandling::error_handler');
+ set_exception_handler('ErrorHandling::exception_handler');
+
+ $blubb = new NonExistingClass();
+?>
+--EXPECTF--
+Deprecated: Non-static method ErrorHandling::error_handler() should not be called statically in %sbug74408.php on line %d
+
+Deprecated: Non-static method ErrorHandling::error_handler() should not be called statically in %sbug74408.php on line %d
+
+Deprecated: Non-static method ErrorHandling::error_handler() should not be called statically in Unknown on line 0
+
+Fatal error: Uncaught Error: Class 'NonExistingClass2' not found in %sbug74408.php:%d
+Stack trace:
+#0 [internal function]: ErrorHandling::error_handler(8192, 'Non-static meth...', '%s', %d, Array)
+#1 %sbug74408.php(%d): set_exception_handler('ErrorHandling::...')
+#2 {main}
+  thrown in %sbug74408.php on line %d
index 28a75b7190f85e2e23b9a3cc0d0339cb84cb4ec1..ff2d22f1d4115c6f137519250fade097ec18e26b 100644 (file)
@@ -755,6 +755,15 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
                        }
                        zend_error(E_DEPRECATED, "%s", error);
                        efree(error);
+                       if (UNEXPECTED(EG(exception))) {
+                               if (callable_name) {
+                                       zend_string_release(callable_name);
+                               }
+                               if (EG(current_execute_data) == &dummy_execute_data) {
+                                       EG(current_execute_data) = dummy_execute_data.prev_execute_data;
+                               }
+                               return FAILURE;
+                       }
                }
                zend_string_release(callable_name);
        }