]> git.kaiwu.me - nginx.git/commitdiff
Upstream: fixed file buffers reinit in ngx_http_upstream_reinit().
authorRoman Arutyunyan <arut@nginx.com>
Thu, 18 Sep 2014 12:37:16 +0000 (16:37 +0400)
committerRoman Arutyunyan <arut@nginx.com>
Thu, 18 Sep 2014 12:37:16 +0000 (16:37 +0400)
Previously, a file buffer start position was reset to the file start.
Now it's reset to the previous file buffer end.  This fixes
reinitialization of requests having multiple successive parts of a
single file.  Such requests are generated by fastcgi module.

src/http/ngx_http_upstream.c

index 000c6de69587fa76038430631329a3ab938555c9..d547ca74e3fbcb064068dde960fa08b4818f4b4a 100644 (file)
@@ -1570,6 +1570,7 @@ done:
 static ngx_int_t
 ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)
 {
+    off_t         file_pos;
     ngx_chain_t  *cl;
 
     if (u->reinit_request(r) != NGX_OK) {
@@ -1591,9 +1592,17 @@ ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)
 
     /* reinit the request chain */
 
+    file_pos = 0;
+
     for (cl = u->request_bufs; cl; cl = cl->next) {
         cl->buf->pos = cl->buf->start;
-        cl->buf->file_pos = 0;
+
+        /* there is at most one file */
+
+        if (cl->buf->in_file) {
+            cl->buf->file_pos = file_pos;
+            file_pos = cl->buf->file_last;
+        }
     }
 
     /* reinit the subrequest's ngx_output_chain() context */