On Thu, Jan 30, 2025 at 11:08:28AM +0100, Maciej S. Szmigiero wrote:
> From: "Maciej S. Szmigiero" <[email protected]>
> 
> 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 <[email protected]>
> ---
>  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) {

IMHO a better way to do this is by defining an new flag for use with
the qio_channel_readv_full() method. That makes the ignoring of
premature shutdown a contextually scoped behaviour rather than a
global behaviour.

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


Reply via email to