]> git.kaiwu.me - nginx.git/commitdiff
SSL: set events ready flags after handshake.
authorMaxim Dounin <mdounin@mdounin.ru>
Tue, 3 Aug 2021 17:50:30 +0000 (20:50 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Tue, 3 Aug 2021 17:50:30 +0000 (20:50 +0300)
The c->read->ready and c->write->ready flags might be reset during
the handshake, and not set again if the handshake was finished on
the other event.  At the same time, some data might be read from
the socket during the handshake, so missing c->read->ready flag might
result in a connection hang, for example, when waiting for an SMTP
greeting (which was already received during the handshake).

Found by Sergey Kandaurov.

src/event/ngx_event_openssl.c

index 396cc22b37746b10a5b0b52851ed0416d7da9635..60cc35876fb41bdb7976d86405cc310f56861b73 100644 (file)
@@ -1740,6 +1740,9 @@ ngx_ssl_handshake(ngx_connection_t *c)
         c->recv_chain = ngx_ssl_recv_chain;
         c->send_chain = ngx_ssl_send_chain;
 
+        c->read->ready = 1;
+        c->write->ready = 1;
+
 #ifndef SSL_OP_NO_RENEGOTIATION
 #if OPENSSL_VERSION_NUMBER < 0x10100000L
 #ifdef SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS
@@ -1885,6 +1888,9 @@ ngx_ssl_try_early_data(ngx_connection_t *c)
         c->recv_chain = ngx_ssl_recv_chain;
         c->send_chain = ngx_ssl_send_chain;
 
+        c->read->ready = 1;
+        c->write->ready = 1;
+
         rc = ngx_ssl_ocsp_validate(c);
 
         if (rc == NGX_ERROR) {