From: Timo Sirainen Date: Fri, 6 Jul 2018 08:24:41 +0000 (+0300) Subject: lib-ssl-iostream: Split code to openssl_iostream_shutdown() X-Git-Tag: 2.3.9~1598 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0e9bfbbf6863b7a11f0fd414db81d2332edc6307;p=thirdparty%2Fdovecot%2Fcore.git lib-ssl-iostream: Split code to openssl_iostream_shutdown() --- diff --git a/src/lib-ssl-iostream/iostream-openssl.c b/src/lib-ssl-iostream/iostream-openssl.c index 2af3c001d2..037fd0bae2 100644 --- a/src/lib-ssl-iostream/iostream-openssl.c +++ b/src/lib-ssl-iostream/iostream-openssl.c @@ -343,8 +343,14 @@ static void openssl_iostream_unref(struct ssl_iostream *ssl_io) openssl_iostream_free(ssl_io); } -static void openssl_iostream_destroy(struct ssl_iostream *ssl_io) +void openssl_iostream_shutdown(struct ssl_iostream *ssl_io) { + if (ssl_io->destroyed) + return; + + i_assert(ssl_io->ssl_input != NULL); + i_assert(ssl_io->ssl_output != NULL); + ssl_io->destroyed = TRUE; if (ssl_io->handshaked && SSL_shutdown(ssl_io->ssl) != 1) { /* if bidirectional shutdown fails we need to clear @@ -357,7 +363,11 @@ static void openssl_iostream_destroy(struct ssl_iostream *ssl_io) but we may still keep this ssl-iostream referenced until later. */ i_stream_close(ssl_io->plain_input); o_stream_close(ssl_io->plain_output); +} +static void openssl_iostream_destroy(struct ssl_iostream *ssl_io) +{ + openssl_iostream_shutdown(ssl_io); ssl_iostream_unref(&ssl_io); } diff --git a/src/lib-ssl-iostream/iostream-openssl.h b/src/lib-ssl-iostream/iostream-openssl.h index ca34fae623..edd4a86af2 100644 --- a/src/lib-ssl-iostream/iostream-openssl.h +++ b/src/lib-ssl-iostream/iostream-openssl.h @@ -116,6 +116,9 @@ int openssl_iostream_handle_error(struct ssl_iostream *ssl_io, int ret, enum openssl_iostream_sync_type type, const char *func_name); +/* Perform clean shutdown for the connection. */ +void openssl_iostream_shutdown(struct ssl_iostream *ssl_io); + void openssl_iostream_set_error(struct ssl_iostream *ssl_io, const char *str); const char *openssl_iostream_error(void); const char *openssl_iostream_key_load_error(void);