Mercurial > dovecot > core-2.2
changeset 13433:c53f15aab7aa
lib-ssl-iostream: If plain stream disconnects, disconnect SSL stream also.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 08 Sep 2011 12:14:54 +0300 |
parents | 2d82377dc855 |
children | 1aa51cd11614 |
files | src/lib-ssl-iostream/iostream-openssl.c src/lib-ssl-iostream/iostream-openssl.h |
diffstat | 2 files changed, 20 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-ssl-iostream/iostream-openssl.c Thu Sep 08 11:51:18 2011 +0300 +++ b/src/lib-ssl-iostream/iostream-openssl.c Thu Sep 08 12:14:54 2011 +0300 @@ -288,8 +288,9 @@ sent = o_stream_send(ssl_io->plain_output, buffer, bytes); if (sent < 0) { i_assert(ssl_io->plain_output->stream_errno != 0); - ssl_io->ssl_output->stream_errno = + ssl_io->plain_stream_errno = ssl_io->plain_output->stream_errno; + ssl_io->closed = TRUE; break; } i_assert(sent == (ssize_t)bytes); @@ -308,7 +309,14 @@ while ((bytes = BIO_ctrl_get_write_guarantee(ssl_io->bio_ext)) > 0) { /* bytes contains how many bytes we can write to bio_ext */ - (void)i_stream_read_data(ssl_io->plain_input, &data, &size, 0); + if (i_stream_read_data(ssl_io->plain_input, + &data, &size, 0) == -1 && + size == 0 && !bytes_read) { + ssl_io->plain_stream_errno = + ssl_io->plain_input->stream_errno; + ssl_io->closed = TRUE; + return FALSE; + } if (size == 0) { /* wait for more input */ break; @@ -377,10 +385,18 @@ i_panic("SSL ostream buffer size not unlimited"); return 0; } + if (ssl_io->closed) { + errno = ssl_io->plain_stream_errno; + return -1; + } return 1; case SSL_ERROR_WANT_READ: ssl_io->want_read = TRUE; (void)ssl_iostream_bio_sync(ssl_io); + if (ssl_io->closed) { + errno = ssl_io->plain_stream_errno; + return -1; + } return ssl_io->want_read ? 0 : 1; case SSL_ERROR_SYSCALL: /* eat up the error queue */
--- a/src/lib-ssl-iostream/iostream-openssl.h Thu Sep 08 11:51:18 2011 +0300 +++ b/src/lib-ssl-iostream/iostream-openssl.h Thu Sep 08 12:14:54 2011 +0300 @@ -34,6 +34,7 @@ char *source; char *last_error; + int plain_stream_errno; /* copied settings */ bool verbose, verbose_invalid_cert, require_valid_cert; @@ -47,6 +48,7 @@ unsigned int cert_broken:1; unsigned int want_read:1; unsigned int ostream_flush_waiting_input:1; + unsigned int closed:1; }; extern int dovecot_ssl_extdata_index;