]> granicus.if.org Git - php/commitdiff
Fixed bug #76948 Failed shutdown/reboot or end session in Windows
authorAnatol Belski <ab@php.net>
Wed, 3 Oct 2018 10:11:43 +0000 (12:11 +0200)
committerAnatol Belski <ab@php.net>
Wed, 3 Oct 2018 10:11:43 +0000 (12:11 +0200)
sapi/cgi/cgi_main.c

index b0f1c1b601dd84c944d7286891193db2583dd33e..d571cf02d4439770efebaa0734b6392d3bac480e 100644 (file)
@@ -226,9 +226,10 @@ static php_cgi_globals_struct php_cgi_globals;
 #ifdef PHP_WIN32
 #define WIN32_MAX_SPAWN_CHILDREN 64
 HANDLE kid_cgi_ps[WIN32_MAX_SPAWN_CHILDREN];
-int kids;
+int kids, cleaning_up = 0;
 HANDLE job = NULL;
 JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { 0 };
+CRITICAL_SECTION cleanup_lock;
 #endif
 
 #ifndef HAVE_ATTRIBUTE_WEAK
@@ -1492,6 +1493,10 @@ BOOL WINAPI fastcgi_cleanup(DWORD sig)
 {
        int i = kids;
 
+       EnterCriticalSection(&cleanup_lock);
+       cleaning_up = 1;
+       LeaveCriticalSection(&cleanup_lock);
+
        while (0 < i--) {
                if (NULL == kid_cgi_ps[i]) {
                                continue;
@@ -2186,6 +2191,7 @@ consult the installation file that came with this distribution, or visit \n\
                        ZeroMemory(&kid_cgi_ps, sizeof(kid_cgi_ps));
                        kids = children < WIN32_MAX_SPAWN_CHILDREN ? children : WIN32_MAX_SPAWN_CHILDREN; 
                        
+                       InitializeCriticalSection(&cleanup_lock);
                        SetConsoleCtrlHandler(fastcgi_cleanup, TRUE);
 
                        /* kids will inherit the env, don't let them spawn */
@@ -2234,6 +2240,13 @@ consult the installation file that came with this distribution, or visit \n\
                        }
 
                        while (parent) {
+                               EnterCriticalSection(&cleanup_lock);
+                               if (cleaning_up) {
+                                       DeleteCriticalSection(&cleanup_lock);
+                                       goto parent_out;
+                               }
+                               LeaveCriticalSection(&cleanup_lock);
+
                                i = kids;
                                while (0 < i--) {
                                        DWORD status;
@@ -2289,6 +2302,8 @@ consult the installation file that came with this distribution, or visit \n\
                        /* restore my env */
                        SetEnvironmentVariable("PHP_FCGI_CHILDREN", kid_buf);
 
+                       DeleteCriticalSection(&cleanup_lock);
+
                        goto parent_out;
                } else {
                        parent = 0;