]> git.kaiwu.me - nginx.git/commitdiff
Request body: avoid linking rb->buf to r->header_in.
authorMaxim Dounin <mdounin@mdounin.ru>
Thu, 14 Mar 2013 12:30:26 +0000 (12:30 +0000)
committerMaxim Dounin <mdounin@mdounin.ru>
Thu, 14 Mar 2013 12:30:26 +0000 (12:30 +0000)
Code to reuse of r->request_body->buf in upstream module assumes it's
dedicated buffer, hence after 1.3.9 (r4931) it might reuse r->header_in
if client_body_in_file_only was set, resulting in original request
corruption.  It is considered to be safer to always create a dedicated
buffer for rb->bufs to avoid such problems.

src/http/ngx_http_request_body.c

index 1d2acb35ed1df81ed6f90fc5ff8ee422a1d89ee9..e0525cc66635995f73f97e26499b5fe150af016a 100644 (file)
@@ -104,7 +104,20 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
         {
             /* the whole request body may be placed in r->header_in */
 
-            rb->buf = r->header_in;
+            b = ngx_calloc_buf(r->pool);
+            if (b == NULL) {
+                rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
+                goto done;
+            }
+
+            b->temporary = 1;
+            b->start = r->header_in->pos;
+            b->pos = r->header_in->pos;
+            b->last = r->header_in->last;
+            b->end = r->header_in->end;
+
+            rb->buf = b;
+
             r->read_event_handler = ngx_http_read_client_request_body_handler;
             r->write_event_handler = ngx_http_request_empty_handler;