From: "Maciej S. Szmigiero" <maciej.szmigi...@oracle.com> Currently, hitting EOF on receive without sender terminating the TLS session properly causes the TLS channel to return an error (unless the channel was already shut down for read).
Add an optional setting whether we instead just return EOF in that case. This possibility will be soon used by the migration multifd code. Signed-off-by: Maciej S. Szmigiero <maciej.szmigi...@oracle.com> --- include/io/channel-tls.h | 11 +++++++++++ io/channel-tls.c | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/include/io/channel-tls.h b/include/io/channel-tls.h index 26c67f17e2d3..8552c0d0266e 100644 --- a/include/io/channel-tls.h +++ b/include/io/channel-tls.h @@ -49,6 +49,7 @@ struct QIOChannelTLS { QCryptoTLSSession *session; QIOChannelShutdown shutdown; guint hs_ioc_tag; + bool premature_eof_okay; }; /** @@ -143,4 +144,14 @@ void qio_channel_tls_handshake(QIOChannelTLS *ioc, QCryptoTLSSession * qio_channel_tls_get_session(QIOChannelTLS *ioc); +/** + * qio_channel_tls_set_premature_eof_okay: + * @ioc: the TLS channel object + * + * Sets whether receiving an EOF without terminating the TLS session properly + * by used the other side is considered okay or an error (the + * default behaviour). + */ +void qio_channel_tls_set_premature_eof_okay(QIOChannelTLS *ioc, bool enabled); + #endif /* QIO_CHANNEL_TLS_H */ diff --git a/io/channel-tls.c b/io/channel-tls.c index aab630e5ae32..1079d6d10de1 100644 --- a/io/channel-tls.c +++ b/io/channel-tls.c @@ -147,6 +147,11 @@ qio_channel_tls_new_client(QIOChannel *master, return NULL; } +void qio_channel_tls_set_premature_eof_okay(QIOChannelTLS *ioc, bool enabled) +{ + ioc->premature_eof_okay = enabled; +} + struct QIOChannelTLSData { QIOTask *task; GMainContext *context; @@ -279,6 +284,7 @@ static ssize_t qio_channel_tls_readv(QIOChannel *ioc, tioc->session, iov[i].iov_base, iov[i].iov_len, + tioc->premature_eof_okay || qatomic_load_acquire(&tioc->shutdown) & QIO_CHANNEL_SHUTDOWN_READ, errp); if (ret == QCRYPTO_TLS_SESSION_ERR_BLOCK) {