summaryrefslogtreecommitdiff
path: root/src/event
diff options
context:
space:
mode:
Diffstat (limited to 'src/event')
-rw-r--r--src/event/modules/ngx_select_module.c16
-rw-r--r--src/event/ngx_event_pipe.c2
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);