]> granicus.if.org Git - php/commitdiff
Fixed bug #78396
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 12 Aug 2019 08:45:13 +0000 (10:45 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 12 Aug 2019 08:45:13 +0000 (10:45 +0200)
NEWS
Zend/tests/bug78396.phpt [new file with mode: 0644]
Zend/zend_execute_API.c
Zend/zend_globals.h
main/streams/streams.c

diff --git a/NEWS b/NEWS
index ff22389e0e340a6c78eafdc87cc3867b2315c047..efa95a30f9f84320342dc91c57e5f669c8c7dec3 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? ????, PHP 7.4.0beta3
 
+- Core:
+  . Fixed bug #78396 (Second file_put_contents in Shutdown hangs script).
+    (Nikita)
+
 - Date:
   . Fixed bug #78383 (Casting a DateTime to array no longer returns its
     properties). (Nikita)
diff --git a/Zend/tests/bug78396.phpt b/Zend/tests/bug78396.phpt
new file mode 100644 (file)
index 0000000..1f08a47
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+Bug #78396: Second file_put_contents in Shutdown hangs script
+--FILE--
+<?php
+register_shutdown_function(function () {
+    file_put_contents(__DIR__ . '/bug78396.txt', '1', FILE_APPEND | LOCK_EX);
+    file_put_contents(__DIR__ . '/bug78396.txt', '2', FILE_APPEND | LOCK_EX);
+    echo "Done\n";
+});
+
+?>
+--CLEAN--
+<?php
+unlink(__DIR__ . '/bug78396.txt');
+?>
+--EXPECT--
+Done
index a530162d50cd03a34ae931be68c1b9176f0e2e21..161390e22a3eb1238272278f7c027fd41b5a02ea 100644 (file)
@@ -265,6 +265,7 @@ void shutdown_executor(void) /* {{{ */
                zend_llist_destroy(&CG(open_files));
        } zend_end_try();
 
+       EG(flags) |= EG_FLAGS_IN_RESOURCE_SHUTDOWN;
        zend_try {
                zend_close_rsrc_list(&EG(regular_list));
        } zend_end_try();
index 21ac4079ff16ce11d43f1ff23f486034ea1b01a5..6332a6f14d8f3f3c4677759330c0e3a3a20e0c9b 100644 (file)
@@ -244,6 +244,7 @@ struct _zend_executor_globals {
 #define EG_FLAGS_INITIAL                               (0)
 #define EG_FLAGS_IN_SHUTDOWN                   (1<<0)
 #define EG_FLAGS_OBJECT_STORE_NO_REUSE (1<<1)
+#define EG_FLAGS_IN_RESOURCE_SHUTDOWN  (1<<2)
 
 struct _zend_ini_scanner_globals {
        zend_file_handle *yy_in;
index 7d81644724d7afe6ec43ebb0cf82cba5c9826bca..566cdcde080650d9e29b5cd509f55f6e8cd44678 100644 (file)
@@ -370,7 +370,7 @@ PHPAPI int _php_stream_free(php_stream *stream, int close_options) /* {{{ */
         * stream free operations in shutdown unless they come from the resource list destruction,
         * or by freeing an enclosed stream (in which case resource list destruction will not have
         * freed it). */
-       if ((EG(flags) & EG_FLAGS_IN_SHUTDOWN) &&
+       if ((EG(flags) & EG_FLAGS_IN_RESOURCE_SHUTDOWN) &&
                        !(close_options & (PHP_STREAM_FREE_RSRC_DTOR|PHP_STREAM_FREE_IGNORE_ENCLOSING))) {
                return 1;
        }