From 508f48eeb58fb20197a657a900c76ccc18d18ec8 Mon Sep 17 00:00:00 2001 From: "Stephen R. van den Berg" <srb@cuci.nl> Date: Sat, 24 Sep 2016 16:03:20 +0200 Subject: [PATCH] EngineIO: Close race during socket upgrades eliminated. --- lib/modules/Protocols.pmod/EngineIO.pmod | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/modules/Protocols.pmod/EngineIO.pmod b/lib/modules/Protocols.pmod/EngineIO.pmod index 399eb0ca82..f32938a264 100644 --- a/lib/modules/Protocols.pmod/EngineIO.pmod +++ b/lib/modules/Protocols.pmod/EngineIO.pmod @@ -150,7 +150,7 @@ class Socket { final string sid; private mixed id; // This is the callback parameter - private mapping options; + protected mapping options; private Stdio.Buffer ci = Stdio.Buffer(); private function(mixed, string|Stdio.Buffer:void) read_cb; private function(mixed:void) close_cb; @@ -185,7 +185,7 @@ class Socket { } //! Close the transport. - final void close() { + void close() { droptimeout(); read_cb(FORCECLOSE); } @@ -437,11 +437,16 @@ class Socket { private Stdio.Buffer bb = Stdio.Buffer(); private String.Buffer sb = String.Buffer(); + final void close() { + if (con) + catch(con.close()); + } + protected void create(Protocols.WebSocket.Request req, Protocols.WebSocket.Connection _con) { con = _con; con.onmessage = recv; - con.onclose = close; + con.onclose = ::close; t::create(req); } @@ -538,8 +543,11 @@ class Socket { } private void flush() { - if(catch(conn.flush())) + if(catch(conn.flush())) { catch(conn.close()); + if (upgtransport) + catch(upgtransport.close()); + } } private void flushrecvq() { -- GitLab