| 545 | } |
| 546 | |
| 547 | static void tlsHandleEvent(tls_connection *conn, int mask) { |
| 548 | int ret, conn_error; |
| 549 | |
| 550 | TLSCONN_DEBUG("tlsEventHandler(): fd=%d, state=%d, mask=%d, r=%d, w=%d, flags=%d", |
| 551 | fd, conn->c.state, mask, conn->c.read_handler != NULL, conn->c.write_handler != NULL, |
| 552 | conn->flags); |
| 553 | |
| 554 | ERR_clear_error(); |
| 555 | |
| 556 | switch (conn->c.state) { |
| 557 | case CONN_STATE_CONNECTING: |
| 558 | conn_error = connGetSocketError((connection *) conn); |
| 559 | if (conn_error) { |
| 560 | conn->c.last_errno = conn_error; |
| 561 | conn->c.state = CONN_STATE_ERROR; |
| 562 | } else { |
| 563 | if (!(conn->flags & TLS_CONN_FLAG_FD_SET)) { |
| 564 | SSL_set_fd(conn->ssl, conn->c.fd); |
| 565 | conn->flags |= TLS_CONN_FLAG_FD_SET; |
| 566 | } |
| 567 | ret = SSL_connect(conn->ssl); |
| 568 | if (ret <= 0) { |
| 569 | WantIOType want = 0; |
| 570 | if (!handleSSLReturnCode(conn, ret, &want)) { |
| 571 | registerSSLEvent(conn, want); |
| 572 | |
| 573 | /* Avoid hitting UpdateSSLEvent, which knows nothing |
| 574 | * of what SSL_connect() wants and instead looks at our |
| 575 | * R/W handlers. |
| 576 | */ |
| 577 | return; |
| 578 | } |
| 579 | |
| 580 | /* If not handled, it's an error */ |
| 581 | conn->c.state = CONN_STATE_ERROR; |
| 582 | } else { |
| 583 | conn->c.state = CONN_STATE_CONNECTED; |
| 584 | } |
| 585 | } |
| 586 | |
| 587 | if (!callHandler((connection *) conn, conn->c.conn_handler)) return; |
| 588 | conn->c.conn_handler = NULL; |
| 589 | break; |
| 590 | case CONN_STATE_ACCEPTING: |
| 591 | ret = SSL_accept(conn->ssl); |
| 592 | if (ret <= 0) { |
| 593 | WantIOType want = 0; |
| 594 | if (!handleSSLReturnCode(conn, ret, &want)) { |
| 595 | /* Avoid hitting UpdateSSLEvent, which knows nothing |
| 596 | * of what SSL_connect() wants and instead looks at our |
| 597 | * R/W handlers. |
| 598 | */ |
| 599 | registerSSLEvent(conn, want); |
| 600 | return; |
| 601 | } |
| 602 | |
| 603 | /* If not handled, it's an error */ |
| 604 | conn->c.state = CONN_STATE_ERROR; |
no test coverage detected