xemu/include/io
Daniel P. Berrangé a2458b6f69 io: return 0 for EOF in TLS session read after shutdown
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.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20181119134228.11031-1-berrange@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
2018-11-19 11:16:46 -06:00
..
channel-buffer.h Clean up ill-advised or unusual header guards 2016-07-12 16:20:46 +02:00
channel-command.h Clean up ill-advised or unusual header guards 2016-07-12 16:20:46 +02:00
channel-file.h io: Fix QIOChannelFile when creating and opening read-write 2018-02-15 16:54:57 +00:00
channel-socket.h qio: non-default context for async conn 2018-03-06 10:19:06 +00:00
channel-tls.h io: return 0 for EOF in TLS session read after shutdown 2018-11-19 11:16:46 -06:00
channel-util.h Clean up ill-advised or unusual header guards 2016-07-12 16:20:46 +02:00
channel-watch.h Clean up ill-advised or unusual header guards 2016-07-12 16:20:46 +02:00
channel-websock.h io: get rid of bounce buffering in websock write path 2017-10-16 16:57:08 +01:00
channel.h io: return 0 for EOF in TLS session read after shutdown 2018-11-19 11:16:46 -06:00
dns-resolver.h Include less of the generated modular QAPI headers 2018-03-02 13:45:50 -06:00
net-listener.h qio: store gsources for net listeners 2018-03-06 10:19:05 +00:00
task.h qio: non-default context for threaded qtask 2018-03-06 10:19:05 +00:00