diff options
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_select_module.c | 16 | ||||
| -rw-r--r-- | src/event/ngx_event_pipe.c | 2 |
2 files changed, 15 insertions, 3 deletions
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c index 9be2c6ff3..667aea5da 100644 --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -147,6 +147,16 @@ ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) return NGX_OK; } + if ((event == NGX_READ_EVENT && ev->write) + || (event == NGX_WRITE_EVENT && !ev->write)) + { + ngx_log_error(NGX_LOG_ALERT, ev->log, 0, + "invalid select %s event fd:%d ev:%i", + ev->write ? "write" : "read", c->fd, event); + return NGX_ERROR; + } + + #if (NGX_WIN32) if ((event == NGX_READ_EVENT) && (max_read >= FD_SETSIZE) @@ -195,6 +205,7 @@ ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) static ngx_int_t ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { + ngx_event_t *e; ngx_connection_t *c; c = ev->data; @@ -235,8 +246,9 @@ ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) #endif if (ev->index < --nevents) { - event_index[ev->index] = event_index[nevents]; - event_index[ev->index]->index = ev->index; + e = event_index[nevents]; + event_index[ev->index] = e; + e->index = ev->index; } ev->index = NGX_INVALID_INDEX; diff --git a/src/event/ngx_event_pipe.c b/src/event/ngx_event_pipe.c index c13d2ea5a..5d5035ce2 100644 --- a/src/event/ngx_event_pipe.c +++ b/src/event/ngx_event_pipe.c @@ -397,7 +397,7 @@ ngx_event_pipe_read_upstream(ngx_event_pipe_t *p) p->free_raw_bufs = p->free_raw_bufs->next; - if (p->free_bufs) { + if (p->free_bufs && p->buf_to_file == NULL) { for (cl = p->free_raw_bufs; cl; cl = cl->next) { if (cl->buf->shadow == NULL) { ngx_pfree(p->pool, cl->buf->start); |
