]> git.kaiwu.me - nginx.git/commitdiff
Request body: restored buffered empty body special case
authorSergey Kandaurov <pluknet@nginx.com>
Fri, 14 Nov 2025 12:06:56 +0000 (16:06 +0400)
committerSergey Kandaurov <s.kandaurov@f5.com>
Thu, 30 Apr 2026 11:09:24 +0000 (15:09 +0400)
This restores a long-standing optimization when the entire request
body is empty and r->request_body_in_file_only is set, used to avoid
writing an empty file as initially introduced in 4c7f51136 (0.4.4).
The previous condition never worked with chunked body filter, where
rb->bufs holds at least the final chunk; in length body filter, it is
used to indicate the last received buffer since 2a7092138 (1.21.2).

The fix is to additionally check if it is the only empty buffer.

Found with UndefinedBehaviorSanitizer (pointer-overflow)

src/http/ngx_http_request_body.c

index 93c69220c5322a92026c484679b2cfe2011eeced..1d8e4081ab5bfac21aa5144e5b4513f3a4bb9c3e 100644 (file)
@@ -581,7 +581,9 @@ ngx_http_write_request_body(ngx_http_request_t *r)
 
         rb->temp_file = tf;
 
-        if (rb->bufs == NULL) {
+        if (rb->bufs == NULL
+            || (!ngx_buf_in_memory(rb->bufs->buf) && rb->bufs->buf->last_buf))
+        {
             /* empty body with r->request_body_in_file_only */
 
             if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,