From c0b64372819966e5e5c75c1a189b16313c9d13f7 Mon Sep 17 00:00:00 2001 From: tokers Date: Sun, 30 Jun 2019 15:10:01 +0800 Subject: [PATCH] improve: checking ev->pending_eof before peeking data from tcp buffer --- src/subsys/ngx_subsys_lua_util.c.tt2 | 44 ++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/subsys/ngx_subsys_lua_util.c.tt2 b/src/subsys/ngx_subsys_lua_util.c.tt2 index dcadad6..467a3e1 100644 --- a/src/subsys/ngx_subsys_lua_util.c.tt2 +++ b/src/subsys/ngx_subsys_lua_util.c.tt2 @@ -3611,6 +3611,50 @@ ngx_[% subsys %]_lua_check_broken_connection([% req_type %] *r, [% END %] } +#endif + +#if (NGX_HAVE_EPOLLRDHUP) + + if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && ngx_use_epoll_rdhup) { + socklen_t len; + + if (!ev->pending_eof) { + return NGX_OK; + } + + ev->eof = 1; + c->error = 1; + + err = 0; + len = sizeof(ngx_err_t); + + /* + * BSDs and Linux return 0 and set a pending error in err + * Solaris returns -1 and sets errno + */ + + if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len) + == -1) + { + err = ngx_socket_errno; + } + + if (err) { + ev->error = 1; + } + + ngx_log_error(NGX_LOG_INFO, ev->log, err, + "epoll_wait() reported that client prematurely closed " + "connection"); + +[% IF http_subsys %] + return NGX_HTTP_CLIENT_CLOSED_REQUEST; + +[% ELSIF stream_subsys %] + return NGX_ERROR; +[% END %] + } + #endif n = recv(c->fd, buf, 1, MSG_PEEK);