diff --git a/src/tls.c b/src/tls.c index ddadb6cf760..d6be8dccbb2 100644 --- a/src/tls.c +++ b/src/tls.c @@ -1236,8 +1236,8 @@ static void updateSSLEvent(tls_connection *conn) { if (conn->flags & TLS_CONN_FLAG_POSTPONE_UPDATE_STATE) return; int mask = aeGetFileEvents(server.el, conn->c.fd); - int need_read = conn->c.read_handler || (conn->flags & TLS_CONN_FLAG_WRITE_WANT_READ); - int need_write = conn->c.write_handler || (conn->flags & TLS_CONN_FLAG_READ_WANT_WRITE); + int need_read = conn->c.read_handler || (conn->c.write_handler && (conn->flags & TLS_CONN_FLAG_WRITE_WANT_READ)); + int need_write = conn->c.write_handler || (conn->c.read_handler && (conn->flags & TLS_CONN_FLAG_READ_WANT_WRITE)); if (need_read && !(mask & AE_READABLE)) aeCreateFileEvent(server.el, conn->c.fd, AE_READABLE, tlsEventHandler, conn); @@ -1444,10 +1444,12 @@ static void tlsHandleEvent(tls_connection *conn, int mask) { if (connTLSAccept((connection *)conn, NULL) == C_ERR || conn->c.state != CONN_STATE_CONNECTED) return; break; case CONN_STATE_CONNECTED: { - int call_read = ((mask & AE_READABLE) && conn->c.read_handler) || - ((mask & AE_WRITABLE) && (conn->flags & TLS_CONN_FLAG_READ_WANT_WRITE)); - int call_write = ((mask & AE_WRITABLE) && conn->c.write_handler) || - ((mask & AE_READABLE) && (conn->flags & TLS_CONN_FLAG_WRITE_WANT_READ)); + int call_read = conn->c.read_handler && + ((mask & AE_READABLE) || + ((mask & AE_WRITABLE) && (conn->flags & TLS_CONN_FLAG_READ_WANT_WRITE))); + int call_write = conn->c.write_handler && + ((mask & AE_WRITABLE) || + ((mask & AE_READABLE) && (conn->flags & TLS_CONN_FLAG_WRITE_WANT_READ))); /* Normally we execute the readable event first, and the writable * event laster. This is useful as sometimes we may be able