From 8a2e07b2b4374362442bc37b4ae7d3e44b90f510 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 26 Oct 2018 14:01:16 +0200 Subject: [PATCH] fix(sam): nil pointer dereference race --- sam/websocket/session.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/sam/websocket/session.go b/sam/websocket/session.go index 6007f8c1b..a61348b69 100644 --- a/sam/websocket/session.go +++ b/sam/websocket/session.go @@ -3,6 +3,7 @@ package websocket import ( "context" "log" + "sync" "time" authTypes "github.com/crusttech/crust/auth/types" @@ -22,6 +23,7 @@ type ( // Session Session struct { id uint64 + once sync.Once conn *websocket.Conn ctx context.Context @@ -138,16 +140,12 @@ func (sess *Session) Handle() (err error) { } func (sess *Session) Close() { - if sess.conn == nil { - // Do not close session - // if there is no connection - return - } - - sess.disconnected() - sess.conn.Close() - store.Delete(sess.id) - sess.conn = nil + sess.once.Do(func() { + sess.disconnected() + sess.conn.Close() + sess.conn = nil + store.Delete(sess.id) + }) } func (sess *Session) readLoop() (err error) {