Skip to content
  • Daniel P. Berrangé's avatar
    io: return 0 for EOF in TLS session read after shutdown · a2458b6f
    Daniel P. Berrangé authored
    
    
    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: default avatarDaniel P. Berrangé <berrange@redhat.com>
    Message-Id: <20181119134228.11031-1-berrange@redhat.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    a2458b6f