diff options
author | Valentin Bartenev <vbart@nginx.com> | 2016-04-08 16:39:49 +0300 |
---|---|---|
committer | Valentin Bartenev <vbart@nginx.com> | 2016-04-08 16:39:49 +0300 |
commit | 900ef17c4775d635f711a568c2e2707dbdfdcfc9 (patch) | |
tree | 375c8bb0c01a7e1bc150250f1845e1cf3267292a /src/os/unix/ngx_recv.c | |
parent | 8e7d8757c656b9d8f0af7953716929c97657474f (diff) | |
download | nginx-900ef17c4775d635f711a568c2e2707dbdfdcfc9.tar.gz nginx-900ef17c4775d635f711a568c2e2707dbdfdcfc9.zip |
Fixed small inconsistency in handling EOF among receive functions.
Now all functions always drop the ready flag in this case.
Diffstat (limited to 'src/os/unix/ngx_recv.c')
-rw-r--r-- | src/os/unix/ngx_recv.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/os/unix/ngx_recv.c b/src/os/unix/ngx_recv.c index fc7f76ce9..b4237245f 100644 --- a/src/os/unix/ngx_recv.c +++ b/src/os/unix/ngx_recv.c @@ -54,7 +54,24 @@ ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, "recv: fd:%d %z of %uz", c->fd, n, size); - if (n >= 0) { + if (n == 0) { + rev->ready = 0; + rev->eof = 1; + + /* + * on FreeBSD recv() may return 0 on closed socket + * even if kqueue reported about available data + */ + + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + rev->available = 0; + } + + return 0; + } + + if (n > 0) { + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { rev->available -= n; @@ -73,18 +90,6 @@ ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) } } - if (n == 0) { - - /* - * on FreeBSD recv() may return 0 on closed socket - * even if kqueue reported about available data - */ - - rev->ready = 0; - rev->eof = 1; - rev->available = 0; - } - return n; } @@ -94,10 +99,6 @@ ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) rev->ready = 0; } - if (n == 0) { - rev->eof = 1; - } - return n; } |