]> source.dussan.org Git - tigervnc.git/commitdiff
Flush data on close
authorPierre Ossman <ossman@cendio.se>
Mon, 18 May 2020 17:40:49 +0000 (19:40 +0200)
committerPierre Ossman <ossman@cendio.se>
Thu, 21 May 2020 09:34:22 +0000 (11:34 +0200)
There might be some final handshake data that is still stuck in the
buffers, so make a best effort attempt at getting it to the client.

common/rfb/VNCSConnectionST.cxx

index 39efb6c6a6fb98d79c6b1849b6dd57c301f17ed1..a00ae435b1fdf50c7c8af6341121859788d000b8 100644 (file)
@@ -114,6 +114,17 @@ void VNCSConnectionST::close(const char* reason)
   else
     vlog.debug("second close: %s (%s)", peerEndpoint.buf, reason);
 
+  try {
+    if (sock->outStream().bufferUsage() > 0) {
+      sock->cork(false);
+      sock->outStream().flush();
+      if (sock->outStream().bufferUsage() > 0)
+        vlog.error("Failed to flush remaining socket data on close");
+    }
+  } catch (rdr::Exception& e) {
+    vlog.error("Failed to flush remaining socket data on close: %s", e.str());
+  }
+
   // Just shutdown the socket and mark our state as closing.  Eventually the
   // calling code will call VNCServerST's removeSocket() method causing us to
   // be deleted.