summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2007-12-12 20:59:58 +0000
committerIgor Sysoev <igor@sysoev.ru>2007-12-12 20:59:58 +0000
commit8cde793350eae89843fa5cfe44a2f4797b9989e9 (patch)
treeee26ebefb009a292d0f9e1e4b44387fe91b0568f
parenta20023696492a5c0e1deb27ac573bb4f0666c59a (diff)
downloadnginx-8cde793350eae89843fa5cfe44a2f4797b9989e9.tar.gz
r1626 merge:
fix segfaults
-rw-r--r--src/event/ngx_event_pipe.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/event/ngx_event_pipe.c b/src/event/ngx_event_pipe.c
index 6dbf8ff49..0b7eb513c 100644
--- a/src/event/ngx_event_pipe.c
+++ b/src/event/ngx_event_pipe.c
@@ -421,6 +421,7 @@ ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p)
{
u_char *prev;
size_t bsize;
+ ngx_int_t rc;
ngx_uint_t flush, prev_last_shadow;
ngx_chain_t *out, **ll, *cl;
ngx_connection_t *downstream;
@@ -451,7 +452,13 @@ ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p)
cl->buf->recycled = 0;
}
- if (p->output_filter(p->output_ctx, p->out) == NGX_ERROR) {
+ rc = p->output_filter(p->output_ctx, p->out);
+
+ if (downstream->destroyed) {
+ return NGX_ABORT;
+ }
+
+ if (rc == NGX_ERROR) {
p->downstream_error = 1;
return ngx_event_pipe_drain_chains(p);
}
@@ -467,12 +474,13 @@ ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p)
cl->buf->recycled = 0;
}
- if (p->output_filter(p->output_ctx, p->in) == NGX_ERROR) {
+ rc = p->output_filter(p->output_ctx, p->in);
- if (downstream->destroyed) {
- return NGX_ABORT;
- }
+ if (downstream->destroyed) {
+ return NGX_ABORT;
+ }
+ if (rc == NGX_ERROR) {
p->downstream_error = 1;
return ngx_event_pipe_drain_chains(p);
}
@@ -602,7 +610,13 @@ ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p)
break;
}
- if (p->output_filter(p->output_ctx, out) == NGX_ERROR) {
+ rc = p->output_filter(p->output_ctx, out);
+
+ if (downstream->destroyed) {
+ return NGX_ABORT;
+ }
+
+ if (rc == NGX_ERROR) {
p->downstream_error = 1;
return ngx_event_pipe_drain_chains(p);
}