]> granicus.if.org Git - php/commitdiff
Fixed bug #45786 (FastCGI process exited unexpectedly)
authorDmitry Stogov <dmitry@php.net>
Tue, 26 Aug 2008 09:56:22 +0000 (09:56 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 26 Aug 2008 09:56:22 +0000 (09:56 +0000)
sapi/cgi/cgi_main.c
sapi/cgi/fastcgi.c
sapi/cgi/fastcgi.h

index f7b1bae20b44f47de7fb5125c28df485a39ac3c1..5b8c1a4e5597d237b9ef34b1928e9078ad5f1d4e 100644 (file)
@@ -774,7 +774,7 @@ static int sapi_cgi_deactivate(TSRMLS_D)
 #ifndef PHP_WIN32
                                !parent &&
 #endif
-                               !fcgi_finish_request((fcgi_request*)SG(server_context))) {
+                               !fcgi_finish_request((fcgi_request*)SG(server_context), 0)) {
                                php_handle_aborted_connection();
                        }
                } else {
@@ -1921,7 +1921,7 @@ consult the installation file that came with this distribution, or visit \n\
                           get path_translated */
                        if (php_request_startup(TSRMLS_C) == FAILURE) {
                                if (fastcgi) {
-                                       fcgi_finish_request(&request);
+                                       fcgi_finish_request(&request, 1);
                                }
                                SG(server_context) = NULL;
                                php_module_shutdown(TSRMLS_C);
@@ -2064,7 +2064,7 @@ fastcgi_request_done:
                        /* only fastcgi will get here */
                        requests++;
                        if (max_requests && (requests == max_requests)) {
-                               fcgi_finish_request(&request);
+                               fcgi_finish_request(&request, 1);
                                if (bindpath) {
                                        free(bindpath);
                                }
index 125e08f5ae6ab1a27d5d51ac0e74dd909d7f8d24..30e667f00e82da7bbea06f6e0f67a175ccb7cd0f 100644 (file)
@@ -662,6 +662,7 @@ static int fcgi_read_request(fcgi_request *req)
        unsigned char buf[FCGI_MAX_LENGTH+8];
 
        req->keep = 0;
+       req->closed = 0;
        req->in_len = 0;
        req->out_hdr = NULL;
        req->out_pos = req->out_buf;
@@ -886,7 +887,6 @@ int fcgi_accept_request(fcgi_request *req)
        HANDLE pipe;
        OVERLAPPED ov;
 #endif
-       fcgi_finish_request(req);
 
        while (1) {
                if (req->fd < 0) {
@@ -1177,13 +1177,16 @@ int fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int l
        return len;
 }
 
-int fcgi_finish_request(fcgi_request *req)
+int fcgi_finish_request(fcgi_request *req, int force_close)
 {
        int ret = 1;
 
        if (req->fd >= 0) {
-               ret = fcgi_flush(req, 1);
-               fcgi_close(req, 0, 1);
+               if (!req->closed) {
+                       ret = fcgi_flush(req, 1);
+                       req->closed = 1;
+               }
+               fcgi_close(req, force_close, 1);
        }
        return ret;
 }
index 5dfa5d541c4e8716626e8d9fb1ba9990e970b186..b5c418138adf56855bd18ffcaa20068c34c59960 100644 (file)
@@ -99,6 +99,7 @@ typedef struct _fcgi_request {
        int            fd;
        int            id;
        int            keep;
+       int            closed;
 
        int            in_len;
        int            in_pad;
@@ -118,7 +119,7 @@ int fcgi_in_shutdown(void);
 int fcgi_listen(const char *path, int backlog);
 void fcgi_init_request(fcgi_request *req, int listen_socket);
 int fcgi_accept_request(fcgi_request *req);
-int fcgi_finish_request(fcgi_request *req);
+int fcgi_finish_request(fcgi_request *req, int force_close);
 
 char* fcgi_getenv(fcgi_request *req, const char* var, int var_len);
 char* fcgi_putenv(fcgi_request *req, char* var, int var_len, char* val);