]> git.kaiwu.me - nginx.git/commitdiff
Cache: reset c->body_start when reading a variant on Vary mismatch.
authorSergey Kandaurov <pluknet@nginx.com>
Fri, 4 Aug 2017 16:37:37 +0000 (19:37 +0300)
committerSergey Kandaurov <pluknet@nginx.com>
Fri, 4 Aug 2017 16:37:37 +0000 (19:37 +0300)
Previously, a variant not present in shared memory and stored on disk using a
secondary key was read using c->body_start from a variant stored with a main
key.  This could result in critical errors "cache file .. has too long header".

src/http/ngx_http_cache.h
src/http/ngx_http_file_cache.c

index cd0b4bbf81410ebb06b1ae2e74fd8a4c0813061c..d010a4ef0adc7dc4945c7ecc9a22ed67ac4557a6 100644 (file)
@@ -80,6 +80,7 @@ struct ngx_http_cache_s {
     ngx_str_t                        vary;
     u_char                           variant[NGX_HTTP_CACHE_KEY_LEN];
 
+    size_t                           buffer_size;
     size_t                           header_start;
     size_t                           body_start;
     off_t                            length;
index e985f27b115bc633d96fe518d02c5e6ee1d383cd..7a5b4ca5be22f6879e53aa33b42e30934f6a376b 100644 (file)
@@ -294,6 +294,8 @@ ngx_http_file_cache_open(ngx_http_request_t *r)
         cln->data = c;
     }
 
+    c->buffer_size = c->body_start;
+
     rc = ngx_http_file_cache_exists(cache, c);
 
     ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
@@ -1230,7 +1232,7 @@ ngx_http_file_cache_reopen(ngx_http_request_t *r, ngx_http_cache_t *c)
 
     c->secondary = 1;
     c->file.name.len = 0;
-    c->body_start = c->buf->end - c->buf->start;
+    c->body_start = c->buffer_size;
 
     ngx_memcpy(c->key, c->variant, NGX_HTTP_CACHE_KEY_LEN);