diff --git a/guacamole-common/src/main/java/net/sourceforge/guacamole/net/GuacamoleTunnel.java b/guacamole-common/src/main/java/net/sourceforge/guacamole/net/GuacamoleTunnel.java index 438a8c03e..4e69051a0 100644 --- a/guacamole-common/src/main/java/net/sourceforge/guacamole/net/GuacamoleTunnel.java +++ b/guacamole-common/src/main/java/net/sourceforge/guacamole/net/GuacamoleTunnel.java @@ -21,6 +21,7 @@ package net.sourceforge.guacamole.net; import java.util.UUID; import java.util.concurrent.locks.ReentrantLock; +import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.io.GuacamoleReader; import net.sourceforge.guacamole.io.GuacamoleWriter; @@ -127,4 +128,14 @@ public class GuacamoleTunnel { return uuid; } + /** + * Release all resources allocated to this GuacamoleTunnel. + * + * @throws GuacamoleException if an error occurs while releasing + * resources. + */ + public void close() throws GuacamoleException { + socket.close(); + } + } 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 233eac4e7..728afb237 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 @@ -190,10 +190,8 @@ public abstract class GuacamoleTunnelServlet extends HttpServlet { // 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); + if (message == null) throw new GuacamoleException("Disconnected."); - } // For all messages, until another stream is ready (we send at least one message) do { @@ -215,10 +213,28 @@ public abstract class GuacamoleTunnelServlet extends HttpServlet { response.flushBuffer(); } + catch (GuacamoleException e) { + + // Detach and close + session.detachTunnel(tunnel); + tunnel.close(); + + throw e; + } catch (UnsupportedEncodingException e) { + + // Detach and close + session.detachTunnel(tunnel); + tunnel.close(); + throw new GuacamoleException("UTF-8 not supported by Java.", e); } catch (IOException e) { + + // Detach and close + session.detachTunnel(tunnel); + tunnel.close(); + throw new GuacamoleException("I/O error writing to servlet output stream.", e); } finally { @@ -273,6 +289,11 @@ public abstract class GuacamoleTunnelServlet extends HttpServlet { } catch (IOException e) { + + // Detach and close + session.detachTunnel(tunnel); + tunnel.close(); + throw new GuacamoleException("I/O Error sending data to server: " + e.getMessage(), e); } finally {