vnc server closed socket after arrow "down" keyevent This is a rewrite for https://bugs.launchpad.net/qemu/+bug/1670377 QEMU 2.6 or later tigervncviwer 1.6 Once get into grub boot interface(choose boot os, or recovery mode), keep pressing arrow down button for couple times, qemu will close the connection, vnc used zrle mode. Interesting place: 1. when stopped at grub interface, only arrow up and down key could trigger it, 2. only in zrle or tight mode, could work well in raw mode 2. it only triggered by remote connection, not happen if local vncviewer and vnc server A trace is attached. Thanks Find the root reason: qio_channel_write is going to write 290124 data, but only wrote 238644, and for the next write 51489, it returned error, then trigger vnc_client_io_error and disconnect socket. ssize_t vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen) { Error *err = NULL; ssize_t ret; ret = qio_channel_write( vs->ioc, (const char *)data, datalen, &err); VNC_DEBUG("Wrote wire %p %zd -> %ld\n", data, datalen, ret); return vnc_client_io_error(vs, ret, &err); } // log file Write Plain: Pending output 0x5579e6bd2c60 size 524288 offset 290124. Wait SSF 0 32760@1493228975.268871:object_class_dynamic_cast_assert qio-channel-socket->qio-channel (io/channel.c:60:qio_channel_writev_full) 32760@1493228975.268876:object_dynamic_cast_assert qio-channel-socket->qio-channel-socket (io/channel-socket.c:508:qio_channel_socket_writev) Wrote wire 0x5579e6bd2c60 290124 -> 290124 Write Plain: Pending output 0x5579e6bd2c60 size 524288 offset 290124. Wait SSF 0 32760@1493228975.731842:object_class_dynamic_cast_assert qio-channel-socket->qio-channel (io/channel.c:60:qio_channel_writev_full) 32760@1493228975.731846:object_dynamic_cast_assert qio-channel-socket->qio-channel-socket (io/channel-socket.c:508:qio_channel_socket_writev) Wrote wire 0x5579e6bd2c60 290124 -> 238644 Write Plain: Pending output 0x5579e6bd2c60 size 65536 offset 51480. Wait SSF 0 32760@1493228975.731934:object_class_dynamic_cast_assert qio-channel-socket->qio-channel (io/channel.c:60:qio_channel_writev_full) 32760@1493228975.731937:object_dynamic_cast_assert qio-channel-socket->qio-channel-socket (io/channel-socket.c:508:qio_channel_socket_writev) Wrote wire 0x5579e6bd2c60 51480 -> -2 vnc_set_share_mode/0x5579e7b6d730: shared -> disconnected > Wrote wire 0x5579e6bd2c60 51480 -> -2 That is QIO_CHANNEL_ERR_BLOCK, aka EAGAIN. This is fixed in the 2.9.0 release with commit 537848ee62195fc06c328b1cd64f4218f404a7f1 Author: Michael Tokarev