]> granicus.if.org Git - php/commitdiff
fix hard_timeout support in shutdown functions
authorAnatol Belski <ab@php.net>
Sun, 5 Jun 2016 09:38:12 +0000 (11:38 +0200)
committerAnatol Belski <ab@php.net>
Mon, 6 Jun 2016 06:41:07 +0000 (08:41 +0200)
Zend/zend_execute_API.c

index dba10e3564687f9b59a5126055284994a86ed4ad..05ee781bd6ecd0cd1d52f326fbccc5f9264ce7af 100644 (file)
@@ -1157,8 +1157,22 @@ static void zend_set_timeout_ex(zend_long seconds, int reset_signals);
 
 ZEND_API ZEND_NORETURN void zend_timeout(int dummy) /* {{{ */
 {
+#if defined(PHP_WIN32)
+       /* No action is needed if we're timed out because zero seconds are
+          just ignored. Also, the hard timeout needs to be respected. If the
+          timer is not restarted properly, it could hang in the shutdown
+          function. */
+       if (EG(hard_timeout) > 0) {
+               EG(timed_out) = 0;
+               zend_set_timeout_ex(EG(hard_timeout), 1);
+               /* XXX Abused, introduce an additional flag if the value needs to be kept. */
+               EG(hard_timeout) = 0;
+       }
+#else
        EG(timed_out) = 0;
        zend_set_timeout_ex(0, 1);
+#endif
+
        zend_error_noreturn(E_ERROR, "Maximum execution time of %pd second%s exceeded", EG(timeout_seconds), EG(timeout_seconds) == 1 ? "" : "s");
 }
 /* }}} */