]> 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:23 +0000 (11:08 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 26 Apr 2006 11:08:23 +0000 (11:08 +0000)
sapi/cgi/fastcgi.c

index 790854b9ec2e37f97201863fcf896d268ba8af2d..dc9a47cd070ae307354d830951c99c78af3b9c86 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;
                }