]> granicus.if.org Git - php/commitdiff
Fixed bug #37205 (Serving binary content/images fails with "comm with server aborted...
authorDmitry Stogov <dmitry@php.net>
Wed, 26 Apr 2006 11:08:10 +0000 (11:08 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 26 Apr 2006 11:08:10 +0000 (11:08 +0000)
NEWS
sapi/cgi/fastcgi.c

diff --git a/NEWS b/NEWS
index d2972c810ff0296cb319bfc53854b8d83fb4aa55..54a84aafea0161c62735c5202814e6a78ebb8fc6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,8 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Apr 2006, PHP 5.1.3RC4
+- Fixed bug #37205 (Serving binary content/images fails with "comm with server
+  aborted" FastCGI err). (Dmitry)
 - Fixed bug #37192 (cc may complain about non-constant initializers in
   hash_adler.c). (Mike)
 - Fixed bug #37191 (chmod takes off sticky bit when safe_mode is On). (Tony)
index 727c48a112aaf255c959aa0472003702b1284455..afa5271d0e72e191d631632e7571701cd26d4641 100644 (file)
@@ -617,8 +617,12 @@ static inline void fcgi_close(fcgi_request *req, int force, int destroy)
                if (is_impersonate) {
                        RevertToSelf();
                }
+#else
+#if 1
+               shutdown(req->fd, 2);
 #else
                close(req->fd);
+#endif
 #endif
                req->fd = -1;
        }
@@ -814,16 +818,30 @@ int fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int l
                memcpy(req->out_pos, str + limit, len - limit);
                req->out_pos += len - limit;
        } else {
-               int pad = ((len + 7) & ~7) - len;
+               int pos = 0;
+               int pad;
 
+               close_packet(req);
+               while ((len - pos) > 0xffff) {
+                       open_packet(req, type);
+                       fcgi_make_header(req->out_hdr, type, req->id, 0xfff8);
+                       req->out_hdr = NULL;
+                       fcgi_flush(req, 0);
+                       if (safe_write(req, str + pos, 0xfff8) != 0xfff8) {
+                               req->keep = 0;
+                               return -1;
+                       }
+                       pos += 0xfff8;
+               }               
+               
+               pad = (((len - pos) + 7) & ~7) - (len - pos);
                rest = pad ? 8 - pad : 0;
 
-               close_packet(req);
                open_packet(req, type);
-               fcgi_make_header(req->out_hdr, type, req->id, len - rest);
+               fcgi_make_header(req->out_hdr, type, req->id, (len - pos) - rest);
                req->out_hdr = NULL;
                fcgi_flush(req, 0);
-               if (safe_write(req, str, len - rest) != len - rest) {
+               if (safe_write(req, str + pos, (len - pos) - rest) != (len - pos) - rest) {
                        req->keep = 0;
                        return -1;
                }