diff --git a/src/connection.c b/src/connection.c index a59463220..3a17d983d 100644 --- a/src/connection.c +++ b/src/connection.c @@ -171,7 +171,7 @@ static int connSocketWrite(connection *conn, const void *data, size_t data_len) /* Don't overwrite the state of a connection that is not already * connected, not to mess with handler callbacks. */ - if (conn->state == CONN_STATE_CONNECTED) + if (errno != EINTR && conn->state == CONN_STATE_CONNECTED) conn->state = CONN_STATE_ERROR; } @@ -188,7 +188,7 @@ static int connSocketRead(connection *conn, void *buf, size_t buf_len) { /* Don't overwrite the state of a connection that is not already * connected, not to mess with handler callbacks. */ - if (conn->state == CONN_STATE_CONNECTED) + if (errno != EINTR && conn->state == CONN_STATE_CONNECTED) conn->state = CONN_STATE_ERROR; } diff --git a/src/connection.h b/src/connection.h index f30a96367..07c1d4dd8 100644 --- a/src/connection.h +++ b/src/connection.h @@ -152,9 +152,6 @@ static inline int connWrite(connection *conn, const void *data, size_t data_len) */ static inline int connRead(connection *conn, void *buf, size_t buf_len) { int ret = conn->type->read(conn, buf, buf_len); - if (ret == -1 && conn->last_errno == EINTR) { - conn->state = CONN_STATE_CONNECTED; - } return ret; } diff --git a/src/tls.c b/src/tls.c index fb2a575ea..2a78b6562 100644 --- a/src/tls.c +++ b/src/tls.c @@ -750,7 +750,14 @@ static int connTLSWrite(connection *conn_, const void *data, size_t data_len) { if (conn->c.state != CONN_STATE_CONNECTED) return -1; ERR_clear_error(); ret = SSL_write(conn->ssl, data, data_len); - + /* If system call was interrupted, there's no need to go through the full + * OpenSSL error handling and just report this for the caller to retry the + * operation. + */ + if (errno == EINTR) { + conn->c.last_errno = EINTR; + return -1; + } if (ret <= 0) { WantIOType want = 0; if (!(ssl_err = handleSSLReturnCode(conn, ret, &want))) { @@ -781,6 +788,14 @@ static int connTLSRead(connection *conn_, void *buf, size_t buf_len) { if (conn->c.state != CONN_STATE_CONNECTED) return -1; ERR_clear_error(); ret = SSL_read(conn->ssl, buf, buf_len); + /* If system call was interrupted, there's no need to go through the full + * OpenSSL error handling and just report this for the caller to retry the + * operation. + */ + if (errno == EINTR) { + conn->c.last_errno = EINTR; + return -1; + } if (ret <= 0) { WantIOType want = 0; if (!(ssl_err = handleSSLReturnCode(conn, ret, &want))) {