qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] io: return 0 for EOF in TLS session read after shutdown
Date: Mon, 19 Nov 2018 08:31:08 -0600	[thread overview]
Message-ID: <aa7c80f5-395e-bd61-fb95-afe87e2ce04d@redhat.com> (raw)
In-Reply-To: <20181119134228.11031-1-berrange@redhat.com>

On 11/19/18 7:42 AM, Daniel P. Berrangé wrote:
> GNUTLS takes a paranoid approach when seeing 0 bytes returned by the
> underlying OS read() function. It will consider this an error and
> return GNUTLS_E_PREMATURE_TERMINATION instead of propagating the 0
> return value. It expects apps to arrange for clean termination at
> the protocol level and not rely on seeing EOF from a read call to
> detect shutdown. This is to harden apps against a malicious 3rd party
> causing termination of the sockets layer.
> 
> This is unhelpful for the QEMU NBD code which does have a clean
> protocol level shutdown, but still relies on seeing 0 from the I/O
> channel read in the coroutine handling incoming replies.
> 
> The upshot is that when using a plain NBD connection shutdown is
> silent, but when using TLS, the client spams the console with
> 
>    Cannot read from TLS channel: Broken pipe
> 
> The NBD connection has, however, called qio_channel_shutdown()
> at this point to indicate that it is done with I/O. This gives
> the opportunity to optimize the code such that when the channel
> has been shutdown in the read direction, the error code
> GNUTLS_E_PREMATURE_TERMINATION gets turned into a '0' return
> instead of an error.

Detecting premature termination when the client has NOT requested 
orderly shutdown is still important, and this patch preserves that 
aspect.  You are only changing the case where the client has informed 
the qio code "yes, an early termination is now okay".

> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---

> +++ b/include/io/channel.h
> @@ -51,9 +51,9 @@ enum QIOChannelFeature {
>   typedef enum QIOChannelShutdown QIOChannelShutdown;
>   
>   enum QIOChannelShutdown {
> -    QIO_CHANNEL_SHUTDOWN_BOTH,
> -    QIO_CHANNEL_SHUTDOWN_READ,
> -    QIO_CHANNEL_SHUTDOWN_WRITE,
> +    QIO_CHANNEL_SHUTDOWN_READ = 1,
> +    QIO_CHANNEL_SHUTDOWN_WRITE = 2,
> +    QIO_CHANNEL_SHUTDOWN_BOTH = 3,

Nice use of bit operations :)

> +++ b/io/channel-tls.c
> @@ -275,6 +275,9 @@ static ssize_t qio_channel_tls_readv(QIOChannel *ioc,
>                   } else {
>                       return QIO_CHANNEL_ERR_BLOCK;
>                   }
> +            } else if (errno == ECONNABORTED &&
> +                       (tioc->shutdown & QIO_CHANNEL_SHUTDOWN_READ)) {
> +                return 0;
>               }

Reviewed-by: Eric Blake <eblake@redhat.com>

I like this patch better than my proposed hack to ignore read errors 
after requesting quit; testing it now.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

      reply	other threads:[~2018-11-19 14:31 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-19 13:42 [Qemu-devel] [PATCH] io: return 0 for EOF in TLS session read after shutdown Daniel P. Berrangé
2018-11-19 14:31 ` Eric Blake [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aa7c80f5-395e-bd61-fb95-afe87e2ce04d@redhat.com \
    --to=eblake@redhat.com \
    --cc=berrange@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).