qemu/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.c io: avoid double-free when closing QIOChannelBuffer 2016-05-26 11:31:09 +05:30
channel-command.c io/channel-command: Do not kill the child process after closing the pipe 2018-02-15 16:54:57 +00:00
channel-file.c io: Add /dev/fdset/ support to QIOChannelFile 2018-02-15 16:54:57 +00:00
channel-socket.c Delete AF_UNIX socket after close 2018-06-28 13:36:59 +01:00
channel-tls.c io: return 0 for EOF in TLS session read after shutdown 2018-11-19 11:16:46 -06:00
channel-util.c sockets: move fd_is_socket() into common sockets code 2018-03-13 18:06:06 +00:00
channel-watch.c io: add methods to set I/O handlers on AioContext 2017-02-21 11:14:07 +00:00
channel-websock.c websock: fix handshake leak 2018-11-01 12:12:09 +04:00
channel.c qio: introduce qio_channel_add_watch_{full|source} 2018-03-06 10:19:04 +00:00
dns-resolver.c qio: non-default context for threaded qtask 2018-03-06 10:19:05 +00:00
Makefile.objs io: introduce a network socket listener API 2017-12-15 15:07:26 +00:00
net-listener.c Remove unnecessary variables for function return value 2018-05-20 08:48:13 +03:00
task.c qio: non-default context for threaded qtask 2018-03-06 10:19:05 +00:00
trace-events io: add trace points for websocket HTTP protocol headers 2017-10-16 16:57:08 +01:00