[nginx] Lingering close changed to handle NGX_AGAIN.

Maxim Dounin mdounin at mdounin.ru
Mon Sep 10 17:29:00 UTC 2018

details:   http://hg.nginx.org/nginx/rev/2b5528023f6b
changeset: 7351:2b5528023f6b
user:      Maxim Dounin <mdounin at mdounin.ru>
date:      Mon Sep 10 18:57:13 2018 +0300
Lingering close changed to handle NGX_AGAIN.

The "do { c->recv() } while (c->read->ready)" form used in the
ngx_http_lingering_close_handler() is not really correct, as for
example with SSL c->read->ready may be still set when returning NGX_AGAIN
due to SSL_ERROR_WANT_WRITE.  Therefore the above might be an infinite loop.

This doesn't really matter in lingering close, as we shutdown write side
of the socket anyway and also disable renegotiation (and even without shutdown
and with renegotiation it requires using very large certificate chain and
tuning socket buffers to trigger SSL_ERROR_WANT_WRITE).  But for the sake of
correctness added an NGX_AGAIN check.


 src/http/ngx_http_request.c |  4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diffs (14 lines):

diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -3311,6 +3311,10 @@ ngx_http_lingering_close_handler(ngx_eve
         ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "lingering read: %z", n);
+        if (n == NGX_AGAIN) {
+            break;
+        }
         if (n == NGX_ERROR || n == 0) {
             ngx_http_close_request(r, 0);

More information about the nginx-devel mailing list