]> git.kaiwu.me - nginx.git/commitdiff
Upstream: fixed parsing of split status lines
authorSergey Kandaurov <pluknet@nginx.com>
Wed, 29 Apr 2026 19:02:20 +0000 (23:02 +0400)
committerSergey Kandaurov <s.kandaurov@f5.com>
Wed, 13 May 2026 17:20:55 +0000 (21:20 +0400)
If the first response line was split across reads and it didn't appear
a status line, the portion already processed was lost.  To preserve ABI,
the change reuses r->header_name_start for proper backtracking on status
line fallback.

src/http/modules/ngx_http_proxy_module.c
src/http/modules/ngx_http_scgi_module.c
src/http/modules/ngx_http_uwsgi_module.c

index 0b388b30fab8fa274b3f35372f95f1e00528cd3f..276cc07502ae714b5e90540d1a422b290f47fcef 100644 (file)
@@ -1752,6 +1752,10 @@ ngx_http_proxy_process_status_line(ngx_http_request_t *r)
 
     u = r->upstream;
 
+    if (r->state == 0) {
+        r->header_name_start = u->buffer.pos;
+    }
+
     rc = ngx_http_parse_status_line(r, &u->buffer, &ctx->status);
 
     if (rc == NGX_AGAIN) {
@@ -1759,6 +1763,7 @@ ngx_http_proxy_process_status_line(ngx_http_request_t *r)
     }
 
     if (rc == NGX_ERROR) {
+        u->buffer.pos = r->header_name_start;
 
 #if (NGX_HTTP_CACHE)
 
index 290394a1fe14cc9d75abdd082ed6fe9645c3ccc7..b4a73a5a6bced5ef8cddcba44674179a4eaab708 100644 (file)
@@ -1028,6 +1028,10 @@ ngx_http_scgi_process_status_line(ngx_http_request_t *r)
 
     u = r->upstream;
 
+    if (r->state == 0) {
+        r->header_name_start = u->buffer.pos;
+    }
+
     rc = ngx_http_parse_status_line(r, &u->buffer, status);
 
     if (rc == NGX_AGAIN) {
@@ -1036,6 +1040,7 @@ ngx_http_scgi_process_status_line(ngx_http_request_t *r)
 
     if (rc == NGX_ERROR) {
         u->process_header = ngx_http_scgi_process_header;
+        u->buffer.pos = r->header_name_start;
         r->state = 0;
         return ngx_http_scgi_process_header(r);
     }
index 4140b1b4041c4c7cec3cbaf69f8a6f313f84296a..ecd6dd0d7e9876aa982864209f3780a4019118f6 100644 (file)
@@ -1267,6 +1267,10 @@ ngx_http_uwsgi_process_status_line(ngx_http_request_t *r)
 
     u = r->upstream;
 
+    if (r->state == 0) {
+        r->header_name_start = u->buffer.pos;
+    }
+
     rc = ngx_http_parse_status_line(r, &u->buffer, status);
 
     if (rc == NGX_AGAIN) {
@@ -1275,6 +1279,7 @@ ngx_http_uwsgi_process_status_line(ngx_http_request_t *r)
 
     if (rc == NGX_ERROR) {
         u->process_header = ngx_http_uwsgi_process_header;
+        u->buffer.pos = r->header_name_start;
         r->state = 0;
         return ngx_http_uwsgi_process_header(r);
     }