diff options
Diffstat (limited to 'src/sfsasl.c')
-rw-r--r-- | src/sfsasl.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/sfsasl.c b/src/sfsasl.c index cad16db..ebea3f2 100644 --- a/src/sfsasl.c +++ b/src/sfsasl.c @@ -9,7 +9,7 @@ */ #include <sm/gen.h> -SM_RCSID("@(#)$Id: sfsasl.c,v 8.118 2008/07/22 15:12:48 ca Exp $") +SM_RCSID("@(#)$Id: sfsasl.c,v 8.120 2013/03/15 17:49:12 guenther Exp $") #include <stdlib.h> #include <sendmail.h> #include <sm/time.h> @@ -628,13 +628,14 @@ tls_retry(ssl, rfd, wfd, tlsstart, timeout, err, where) "STARTTLS=%s, error: fd %d/%d too large", where, rfd, wfd); if (LogLevel > 8) - tlslogerr(where); + tlslogerr(LOG_WARNING, where); } errno = EINVAL; } else if (err == SSL_ERROR_WANT_READ) { fd_set ssl_maskr, ssl_maskx; + int save_errno = errno; FD_ZERO(&ssl_maskr); FD_SET(rfd, &ssl_maskr); @@ -647,10 +648,12 @@ tls_retry(ssl, rfd, wfd, tlsstart, timeout, err, where) } while (ret < 0 && errno == EINTR); if (ret < 0 && errno > 0) ret = -errno; + errno = save_errno; } else if (err == SSL_ERROR_WANT_WRITE) { fd_set ssl_maskw, ssl_maskx; + int save_errno = errno; FD_ZERO(&ssl_maskw); FD_SET(wfd, &ssl_maskw); @@ -663,6 +666,7 @@ tls_retry(ssl, rfd, wfd, tlsstart, timeout, err, where) } while (ret < 0 && errno == EINTR); if (ret < 0 && errno > 0) ret = -errno; + errno = save_errno; } return ret; } @@ -770,8 +774,17 @@ tls_read(fp, buf, size) break; #endif /* DEAL_WITH_ERROR_SSL */ err = "generic SSL error"; + if (LogLevel > 9) - tlslogerr("read"); + { + int pri; + + if (errno == EAGAIN && try > 0) + pri = LOG_DEBUG; + else + pri = LOG_WARNING; + tlslogerr(pri, "read"); + } #if DEAL_WITH_ERROR_SSL /* avoid repeated calls? */ @@ -792,11 +805,19 @@ tls_read(fp, buf, size) "STARTTLS: read error=timeout"); } else if (LogLevel > 8) - sm_syslog(LOG_WARNING, NOQID, + { + int pri; + + if (save_errno == EAGAIN && try > 0) + pri = LOG_DEBUG; + else + pri = LOG_WARNING; + sm_syslog(pri, NOQID, "STARTTLS: read error=%s (%d), errno=%d, get_error=%s, retry=%d, ssl_err=%d", err, r, errno, ERR_error_string(ERR_get_error(), NULL), try, ssl_err); + } else if (LogLevel > 7) sm_syslog(LOG_WARNING, NOQID, "STARTTLS: read error=%s (%d), retry=%d, ssl_err=%d", @@ -878,7 +899,7 @@ tls_write(fp, buf, size) ERR_GET_REASON(ERR_peek_error())); */ if (LogLevel > 9) - tlslogerr("write"); + tlslogerr(LOG_WARNING, "write"); #if DEAL_WITH_ERROR_SSL /* avoid repeated calls? */ |