From: Eric Bollengier Date: Fri, 4 Nov 2022 08:08:40 +0000 (+0100) Subject: Stay in non-blocking state for the entire TLS connection X-Git-Tag: Beta-15.0.0~376 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64bd207b7ec8c8045a8b926fcbc167d37f56264a;p=thirdparty%2Fbacula.git Stay in non-blocking state for the entire TLS connection --- diff --git a/bacula/src/lib/bsockcore.c b/bacula/src/lib/bsockcore.c index db1443b56..9b5559107 100644 --- a/bacula/src/lib/bsockcore.c +++ b/bacula/src/lib/bsockcore.c @@ -466,7 +466,7 @@ bool BSOCKCORE::open(JCR *jcr, const char *name, char *host, char *service, m_terminated = false; m_suppress_error_msgs = false; errors = 0; - m_blocking = 0; + m_blocking = 1; /* The socket will block by default */ #ifdef INET6_ADDRSTRLEN char info[2*INET6_ADDRSTRLEN+20]; diff --git a/bacula/src/lib/tls.c b/bacula/src/lib/tls.c index 355b9c91e..bfdcbc77f 100644 --- a/bacula/src/lib/tls.c +++ b/bacula/src/lib/tls.c @@ -719,8 +719,8 @@ static inline bool openssl_bsock_session_start(BSOCK *bsock, bool server) { TLS_CONNECTION *tls = bsock->tls; int err; - int flags; int stat = true; + int flags; /* Ensure that socket is non-blocking */ flags = bsock->set_nonblocking(); @@ -768,8 +768,10 @@ static inline bool openssl_bsock_session_start(BSOCK *bsock, bool server) } cleanup: - /* Restore saved flags */ - bsock->restore_blocking(flags); + if (!stat) { + // Got an error, restore the blocking state + bsock->restore_blocking(flags); + } /* Clear timer */ bsock->timer_start = 0; bsock->set_killable(true); @@ -866,8 +868,6 @@ static inline int openssl_bsock_readwrite(BSOCK *bsock, char *ptr, int nbytes, b while (nleft > 0) { pthread_mutex_lock(&tls->rwlock); - /* Ensure that socket is non-blocking */ - int flags = bsock->set_nonblocking(); int ssl_error = SSL_ERROR_NONE; while (nleft > 0 && ssl_error == SSL_ERROR_NONE) { if (write) { @@ -884,8 +884,6 @@ static inline int openssl_bsock_readwrite(BSOCK *bsock, char *ptr, int nbytes, b ssl_error = SSL_get_error(tls->openssl, nwritten); } } - /* Restore saved flags */ - bsock->restore_blocking(flags); pthread_mutex_unlock(&tls->rwlock); /* Handle errors */