]> git.kaiwu.me - nginx.git/commitdiff
Upstream: fixed zero size buf alerts on extra data (ticket #2117).
authorMaxim Dounin <mdounin@mdounin.ru>
Tue, 12 Jan 2021 13:59:31 +0000 (16:59 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Tue, 12 Jan 2021 13:59:31 +0000 (16:59 +0300)
After 7675:9afa45068b8f and 7678:bffcc5af1d72 (1.19.1), during non-buffered
simple proxying, responses with extra data might result in zero size buffers
being generated and "zero size buf" alerts in writer.  This bug is similar
to the one with FastCGI proxying fixed in 7689:da8d758aabeb.

In non-buffered mode, normally the filter function is not called if
u->length is already 0, since u->length is checked after each call of
the filter function.  There is a case when this can happen though: if
the response length is 0, and there are pre-read response body data left
after reading response headers.  As such, a check for u->length is needed
at the start of non-buffered filter functions, similar to the one
for p->length present in buffered filter functions.

Appropriate checks added to the existing non-buffered copy filters
in the upstream (used by scgi and uwsgi proxying) and proxy modules.

src/http/modules/ngx_http_proxy_module.c
src/http/ngx_http_upstream.c

index 3d8768af6739855730e4e11f8afd9f8090feea98..77a1e0d7f697184d9f4f7af02fcf8b65b64287ed 100644 (file)
@@ -2334,6 +2334,13 @@ ngx_http_proxy_non_buffered_copy_filter(void *data, ssize_t bytes)
 
     u = r->upstream;
 
+    if (u->length == 0) {
+        ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,
+                      "upstream sent more data than specified in "
+                      "\"Content-Length\" header");
+        return NGX_OK;
+    }
+
     for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {
         ll = &cl->next;
     }
index dda4046be8a116f7179f5af3cb5368949c8d3c5d..9cbb5a3b0c9735fa25abb0fac010fc93b2c25268 100644 (file)
@@ -3721,6 +3721,13 @@ ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes)
 
     u = r->upstream;
 
+    if (u->length == 0) {
+        ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,
+                      "upstream sent more data than specified in "
+                      "\"Content-Length\" header");
+        return NGX_OK;
+    }
+
     for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {
         ll = &cl->next;
     }