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