summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2016-04-11 18:42:34 +0300
committerValentin Bartenev <vbart@nginx.com>2016-04-11 18:42:34 +0300
commit4c1b9fef65e9a992933ae0168e62bba279eabfab (patch)
tree8476beb5c5a5e46d306202742d96fc46dedcb8ec
parent400d42437cd7aba791ec2d874fe9badf6446638c (diff)
downloadnginx-4c1b9fef65e9a992933ae0168e62bba279eabfab.tar.gz
FastCGI: skip special bufs in buffered request body chain.
This prevents forming empty records out of such buffers. Particularly it fixes double end-of-stream records with chunked transfer encoding, or when HTTP/2 is used and the END_STREAM flag has been sent without data. In both cases there is an empty buffer at the end of the request body chain with the "last_buf" flag set. The canonical libfcgi, as well as php implementation, tolerates such records, while the HHVM parser is more strict and drops the connection (ticket #950).
-rw-r--r--src/http/modules/ngx_http_fastcgi_module.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/http/modules/ngx_http_fastcgi_module.c b/src/http/modules/ngx_http_fastcgi_module.c
index a86120377..2d288ce93 100644
--- a/src/http/modules/ngx_http_fastcgi_module.c
+++ b/src/http/modules/ngx_http_fastcgi_module.c
@@ -1177,6 +1177,11 @@ ngx_http_fastcgi_create_request(ngx_http_request_t *r)
while (body) {
+ if (ngx_buf_special(body->buf)) {
+ body = body->next;
+ continue;
+ }
+
if (body->buf->in_file) {
file_pos = body->buf->file_pos;