]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-ssl-iostream: Don't set EPIPE/ECONNRESET error to istream when connection is...
authorTimo Sirainen <tss@iki.fi>
Thu, 29 Jan 2015 16:43:15 +0000 (18:43 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 29 Jan 2015 16:43:15 +0000 (18:43 +0200)
Several istream users verify at EOF that stream_errno=0 and fail if it
isn't.

src/lib-ssl-iostream/iostream-openssl.c
src/lib-ssl-iostream/istream-openssl.c

index de2bb2da2ab385e49ee82d13024a719d43d3efbe..5bad303e81e67f462baf16aa97a3a93d5cfb4cc8 100644 (file)
@@ -387,11 +387,13 @@ static bool openssl_iostream_bio_input(struct ssl_iostream *ssl_io)
                ret = openssl_iostream_read_more(ssl_io, &data, &size);
                ssl_io->plain_input->real_stream->try_alloc_limit = 0;
                if (ret == -1 && size == 0 && !bytes_read) {
-                       i_free(ssl_io->plain_stream_errstr);
-                       ssl_io->plain_stream_errstr =
-                               i_strdup(i_stream_get_error(ssl_io->plain_input));
-                       ssl_io->plain_stream_errno =
-                               ssl_io->plain_input->stream_errno;
+                       if (ssl_io->plain_input->stream_errno != 0) {
+                               i_free(ssl_io->plain_stream_errstr);
+                               ssl_io->plain_stream_errstr =
+                                       i_strdup(i_stream_get_error(ssl_io->plain_input));
+                               ssl_io->plain_stream_errno =
+                                       ssl_io->plain_input->stream_errno;
+                       }
                        ssl_io->closed = TRUE;
                        return FALSE;
                }
@@ -504,7 +506,7 @@ openssl_iostream_handle_error_full(struct ssl_iostream *ssl_io, int ret,
                        errstr = strerror(errno);
                } else {
                        /* EOF. */
-                       errno = ECONNRESET;
+                       errno = EPIPE;
                        errstr = "Disconnected";
                        break;
                }
@@ -513,7 +515,7 @@ openssl_iostream_handle_error_full(struct ssl_iostream *ssl_io, int ret,
                break;
        case SSL_ERROR_ZERO_RETURN:
                /* clean connection closing */
-               errno = ECONNRESET;
+               errno = EPIPE;
                i_free_and_null(ssl_io->last_error);
                return -1;
        case SSL_ERROR_SSL:
index a0cf65f053a3b359d61d2b4015abd4e825cbdbb3..b4e983c7700119018365c6b076e8a339c377e5d0 100644 (file)
@@ -78,7 +78,8 @@ static ssize_t i_stream_ssl_read_real(struct istream_private *stream)
                                io_stream_set_error(&stream->iostream,
                                                    "%s", ssl_io->last_error);
                        }
-                       stream->istream.stream_errno = errno;
+                       if (errno != EPIPE)
+                               stream->istream.stream_errno = errno;
                        stream->istream.eof = TRUE;
                        sstream->seen_eof = TRUE;
                        return -1;