| 821 | } |
| 822 | |
| 823 | void tlsHandleEvent(tls_connection *conn, int mask) { |
| 824 | int ret, conn_error; |
| 825 | serverAssert(conn->el == serverTL->el); |
| 826 | |
| 827 | TLSCONN_DEBUG("tlsEventHandler(): fd=%d, state=%d, mask=%d, r=%d, w=%d, flags=%d", |
| 828 | fd, conn->c.state, mask, conn->c.read_handler != NULL, conn->c.write_handler != NULL, |
| 829 | conn->flags); |
| 830 | |
| 831 | ERR_clear_error(); |
| 832 | |
| 833 | switch (conn->c.state) { |
| 834 | case CONN_STATE_CONNECTING: |
| 835 | conn_error = connGetSocketError((connection *) conn); |
| 836 | if (conn_error) { |
| 837 | conn->c.last_errno = conn_error; |
| 838 | conn->c.state = CONN_STATE_ERROR; |
| 839 | } else { |
| 840 | if (!(conn->flags & TLS_CONN_FLAG_FD_SET)) { |
| 841 | SSL_set_fd(conn->ssl, conn->c.fd); |
| 842 | conn->flags |= TLS_CONN_FLAG_FD_SET; |
| 843 | } |
| 844 | ret = SSL_connect(conn->ssl); |
| 845 | if (ret <= 0) { |
| 846 | WantIOType want = WANT_INVALID; |
| 847 | if (!handleSSLReturnCode(conn, ret, &want)) { |
| 848 | registerSSLEvent(conn, want); |
| 849 | |
| 850 | /* Avoid hitting UpdateSSLEvent, which knows nothing |
| 851 | * of what SSL_connect() wants and instead looks at our |
| 852 | * R/W handlers. |
| 853 | */ |
| 854 | return; |
| 855 | } |
| 856 | |
| 857 | /* If not handled, it's an error */ |
| 858 | conn->c.state = CONN_STATE_ERROR; |
| 859 | } else { |
| 860 | conn->c.state = CONN_STATE_CONNECTED; |
| 861 | } |
| 862 | } |
| 863 | |
| 864 | { |
| 865 | AeLocker locker; |
| 866 | locker.arm(nullptr); |
| 867 | if (!callHandler((connection *) conn, conn->c.conn_handler)) return; |
| 868 | } |
| 869 | conn->c.conn_handler = NULL; |
| 870 | break; |
| 871 | case CONN_STATE_ACCEPTING: |
| 872 | ret = SSL_accept(conn->ssl); |
| 873 | if (ret <= 0) { |
| 874 | WantIOType want = WANT_INVALID; |
| 875 | if (!handleSSLReturnCode(conn, ret, &want)) { |
| 876 | /* Avoid hitting UpdateSSLEvent, which knows nothing |
| 877 | * of what SSL_connect() wants and instead looks at our |
| 878 | * R/W handlers. |
| 879 | */ |
| 880 | registerSSLEvent(conn, want); |
no test coverage detected