Event pipe: fixed handling of buf_to_file data.
Input filter might free a buffer if there is no data in it, and in case of first buffer (used for cache header and request header, aka p->buf_to_file) this resulted in cache corruption. Buffer memory was reused to read upstream response before headers were written to disk. Fix is to avoid moving pointers in ngx_event_pipe_add_free_buf() to a buffer start if we were asked to free a buffer used by p->buf_to_file. This fixes occasional cache file corruption, usually resulted in "cache file ... has md5 collision" alerts. Reported by Anatoli Marinov.
This commit is contained in:
parent
71d4250024
commit
ef0636141d
2 changed files with 10 additions and 2 deletions
|
@ -946,8 +946,15 @@ ngx_event_pipe_add_free_buf(ngx_event_pipe_t *p, ngx_buf_t *b)
|
|||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
b->pos = b->start;
|
||||
b->last = b->start;
|
||||
if (p->buf_to_file && b->start == p->buf_to_file->start) {
|
||||
b->pos = p->buf_to_file->last;
|
||||
b->last = p->buf_to_file->last;
|
||||
|
||||
} else {
|
||||
b->pos = b->start;
|
||||
b->last = b->start;
|
||||
}
|
||||
|
||||
b->shadow = NULL;
|
||||
|
||||
cl->buf = b;
|
||||
|
|
|
@ -2287,6 +2287,7 @@ ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
|
|||
return;
|
||||
}
|
||||
|
||||
p->buf_to_file->start = u->buffer.start;
|
||||
p->buf_to_file->pos = u->buffer.start;
|
||||
p->buf_to_file->last = u->buffer.pos;
|
||||
p->buf_to_file->temporary = 1;
|
||||
|
|
Loading…
Reference in a new issue