diff --git a/src/common/tortls.c b/src/common/tortls.c index dbfbe29c0d..f7d961ab83 100644 --- a/src/common/tortls.c +++ b/src/common/tortls.c @@ -57,8 +57,11 @@ tls_log_error(int severity, const char *doing) } } +#define CATCH_SYSCALL 1 +#define CATCH_ZERO 2 + static int -tor_tls_get_error(tor_tls *tls, int r, int extra, +tor_tls_get_error(tor_tls *tls, int r, int extra, const char *doing, int severity) { int err = SSL_get_error(tls->ssl, r); @@ -70,13 +73,15 @@ tor_tls_get_error(tor_tls *tls, int r, int extra, case SSL_ERROR_WANT_WRITE: return TOR_TLS_WANTWRITE; case SSL_ERROR_SYSCALL: - /* This is oververbose XXX */ - tls_log_error(severity, doing); - return extra ? _TOR_TLS_SYSCALL : TOR_TLS_ERROR; + if (extra&CATCH_SYSCALL) + return _TOR_TLS_SYSCALL; + log(severity, "TLS error: ."); + return TOR_TLS_ERROR; case SSL_ERROR_ZERO_RETURN: - /* This is oververbose XXX */ - tls_log_error(severity, doing); - return extra ? _TOR_TLS_ZERORETURN : TOR_TLS_ERROR; + if (extra&CATCH_ZERO) + return _TOR_TLS_ZERORETURN; + log(severity, "TLS error: Zero return"); + return TOR_TLS_ERROR; default: tls_log_error(severity, doing); return TOR_TLS_ERROR; @@ -299,11 +304,8 @@ tor_tls_read(tor_tls *tls, char *cp, int len) r = SSL_read(tls->ssl, cp, len); if (r > 0) return r; - err = tor_tls_get_error(tls, r, 1, "reading", LOG_ERR); - if (err == _TOR_TLS_SYSCALL) { - log(LOG_ERR, "TLS error while reading: syscall error"); - return TOR_TLS_ERROR; - } else if (err == _TOR_TLS_ZERORETURN) { + err = tor_tls_get_error(tls, r, CATCH_ZERO, "reading", LOG_ERR); + if (err == _TOR_TLS_ZERORETURN) { tls->state = TOR_TLS_ST_CLOSED; return TOR_TLS_CLOSE; } else { @@ -326,8 +328,7 @@ tor_tls_write(tor_tls *tls, char *cp, int n) if (n == 0) return 0; r = SSL_write(tls->ssl, cp, n); - err = tor_tls_get_error(tls, r, 1, "writing", LOG_ERR); - assert(err != _TOR_TLS_ZERORETURN); + err = tor_tls_get_error(tls, r, 0, "writing", LOG_ERR); if (err == TOR_TLS_DONE) { return r; } else { @@ -376,13 +377,12 @@ tor_tls_shutdown(tor_tls *tls) do { r = SSL_read(tls->ssl, buf, 128); } while (r>0); - err = tor_tls_get_error(tls, r, 1, "reading to shut down", LOG_ERR); + err = tor_tls_get_error(tls, r, CATCH_ZERO, "reading to shut down", + LOG_ERR); if (err == _TOR_TLS_ZERORETURN) { tls->state = TOR_TLS_ST_GOTCLOSE; /* fall through... */ } else { - if (err == _TOR_TLS_SYSCALL) - err = TOR_TLS_ERROR; return err; } } @@ -393,7 +393,8 @@ tor_tls_shutdown(tor_tls *tls) tls->state = TOR_TLS_ST_CLOSED; return TOR_TLS_DONE; } - err = tor_tls_get_error(tls, r, 1, "shutting down", LOG_ERR); + err = tor_tls_get_error(tls, r, CATCH_SYSCALL|CATCH_ZERO, "shutting down", + LOG_ERR); if (err == _TOR_TLS_SYSCALL) { /* The underlying TCP connection closed while we were shutting down. */ tls->state = TOR_TLS_ST_CLOSED;