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);
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;
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 */
char *source;
char *last_error;
+ int plain_stream_errno;
/* copied settings */
bool verbose, verbose_invalid_cert, require_valid_cert;
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;