From 88b186a856a8a673b03ce1d92073b82a96b83f4b Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 4 Jul 2011 14:24:40 -0700 Subject: [PATCH] Fix race condition where tunnel is detached before client has chance to retrieve error message in header via second request. --- .../servlet/GuacamoleTunnelServlet.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java b/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java index 55ad9c2ac..233eac4e7 100644 --- a/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java +++ b/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java @@ -187,9 +187,16 @@ public abstract class GuacamoleTunnelServlet extends HttpServlet { Writer out = response.getWriter(); + // Detach tunnel and throw error if EOF (and we haven't sent any + // data yet. + char[] message = reader.read(); + if (message == null) { + session.detachTunnel(tunnel); + throw new GuacamoleException("Disconnected."); + } + // For all messages, until another stream is ready (we send at least one message) - char[] message; - while ((message = reader.read()) != null) { + do { // Get message output bytes out.write(message, 0, message.length); @@ -200,12 +207,7 @@ public abstract class GuacamoleTunnelServlet extends HttpServlet { if (tunnel.hasQueuedReaderThreads()) break; - } - - if (message == null) { - session.detachTunnel(tunnel); - throw new GuacamoleException("Disconnected."); - } + } while ((message = reader.read()) != null); // End-of-instructions marker out.write(';');