]> git.kaiwu.me - nginx.git/commit
Event pipe: fixed buffer loss in p->length case.
authorMaxim Dounin <mdounin@mdounin.ru>
Wed, 22 Feb 2012 11:28:53 +0000 (11:28 +0000)
committerMaxim Dounin <mdounin@mdounin.ru>
Wed, 22 Feb 2012 11:28:53 +0000 (11:28 +0000)
commitb5d0d7a232f57f26a340e7e391110055c9fcd876
treee19ef9197dcd6099996141975535bae02f17801d
parent86c5513ecb34ab90027935c329e74b41fdc3a49e
Event pipe: fixed buffer loss in p->length case.

With previous code raw buffer might be lost if p->input_filter() was called
on a buffer without any data and used ngx_event_pipe_add_free_buf() to
return it to the free list.  This eventually might cause "all buffers busy"
problem, resulting in segmentation fault due to null pointer dereference in
ngx_event_pipe_write_chain_to_temp_file().

In ngx_event_pipe_add_free_buf() the buffer was added to the list start
due to pos == last, and then "p->free_raw_bufs = cl->next" in
ngx_event_pipe_read_upstream() dropped both chain links to the buffer
from the p->free_raw_bufs list.

Fix is to move "p->free_raw_bufs = cl->next" before calling the
p->input_filter().
src/event/ngx_event_pipe.c