summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2008-04-18 18:52:51 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2008-04-18 18:52:51 +0200
commitd3b135ba9fd390caa7a0a942dae4faf979c4ece1 (patch)
tree7270b6baa404f5c063a4afb3e4c95b6bdc9db93d
parent2069ab114e2aac9c243aff72042912cac7ef6126 (diff)
downloadrsyslog-d3b135ba9fd390caa7a0a942dae4faf979c4ece1.tar.gz
rsyslog-d3b135ba9fd390caa7a0a942dae4faf979c4ece1.tar.xz
rsyslog-d3b135ba9fd390caa7a0a942dae4faf979c4ece1.zip
improved TLS session closure
-rw-r--r--runtime/nsd_gtls.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/runtime/nsd_gtls.c b/runtime/nsd_gtls.c
index d1b44fc5..648b843e 100644
--- a/runtime/nsd_gtls.c
+++ b/runtime/nsd_gtls.c
@@ -103,6 +103,27 @@ gtlsGlblExit(void)
}
+/* end a GnuTLS session
+ * The function checks if we have a session and ends it only if so. So it can
+ * always be called, even if there currently is no session.
+ */
+static rsRetVal
+gtlsEndSess(nsd_gtls_t *pThis)
+{
+ int gnuRet;
+ DEFiRet;
+
+ if(pThis->bHaveSess) {
+ gnuRet = gnutls_bye(pThis->sess, GNUTLS_SHUT_RDWR);
+ while(gnuRet == GNUTLS_E_INTERRUPTED || gnuRet == GNUTLS_E_AGAIN) {
+ gnuRet = gnutls_bye(pThis->sess, GNUTLS_SHUT_RDWR);
+ }
+ gnutls_deinit(pThis->sess);
+ }
+ RETiRet;
+}
+
+
/* ---------------------------- end GnuTLS specifics ---------------------------- */
@@ -117,11 +138,7 @@ ENDobjConstruct(nsd_gtls)
BEGINobjDestruct(nsd_gtls) /* be sure to specify the object type also in END and CODESTART macros! */
CODESTARTobjDestruct(nsd_gtls)
if(pThis->iMode == 1) {
- if(pThis->bHaveSess) {
- // TODO: Check for EAGAIN et al
- gnutls_bye(pThis->sess, GNUTLS_SHUT_RDWR);
- gnutls_deinit(pThis->sess);
- }
+ gtlsEndSess(pThis);
}
if(pThis->pTcp != NULL)