aboutsummaryrefslogtreecommitdiff
path: root/client_conn.go
diff options
context:
space:
mode:
Diffstat (limited to 'client_conn.go')
-rw-r--r--client_conn.go134
1 files changed, 104 insertions, 30 deletions
diff --git a/client_conn.go b/client_conn.go
index d665cc5..ced6923 100644
--- a/client_conn.go
+++ b/client_conn.go
@@ -95,32 +95,52 @@ func handleClt(cc *clientConn) {
if cmd.SerializeVer != latestSerializeVer {
cc.log("<--", "invalid serializeVer")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.UnsupportedVer})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
if cmd.MaxProtoVer < latestProtoVer {
cc.log("<--", "invalid protoVer")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.UnsupportedVer})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
if len(cmd.PlayerName) == 0 || len(cmd.PlayerName) > maxPlayerNameLen {
cc.log("<--", "invalid player name length")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.BadName})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
if ok, _ := regexp.MatchString(playerNameChars, cmd.PlayerName); !ok {
cc.log("<--", "invalid player name")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.BadNameChars})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
@@ -131,8 +151,12 @@ func handleClt(cc *clientConn) {
if ok {
cc.log("<--", "already connected")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.AlreadyConnected})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
playersMu.Unlock()
break
@@ -144,8 +168,13 @@ func handleClt(cc *clientConn) {
if cc.name == "singleplayer" {
cc.log("<--", "name is singleplayer")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.BadName})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
@@ -153,8 +182,13 @@ func handleClt(cc *clientConn) {
if len(players) >= conf.UserLimit {
cc.log("<--", "player limit reached")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.TooManyClts})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
@@ -176,8 +210,13 @@ func handleClt(cc *clientConn) {
if cc.auth.method != mt.FirstSRP {
cc.log("-->", "unauthorized password change")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.UnexpectedData})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
@@ -186,16 +225,26 @@ func handleClt(cc *clientConn) {
if cmd.EmptyPasswd && conf.RequirePasswd {
cc.log("<--", "empty password disallowed")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.EmptyPasswd})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
if err := authIface.SetPasswd(cc.name, cmd.Salt, cmd.Verifier); err != nil {
cc.log("<--", "set password fail")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.SrvErr})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
@@ -247,8 +296,13 @@ func handleClt(cc *clientConn) {
}
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.UnexpectedData})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
@@ -263,8 +317,13 @@ func handleClt(cc *clientConn) {
if err != nil {
cc.log("<--", "SRP data retrieval fail")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.SrvErr})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
@@ -274,8 +333,13 @@ func handleClt(cc *clientConn) {
if err != nil || cc.auth.srpB == nil {
cc.log("<--", "SRP safety check fail")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.UnexpectedData})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
@@ -299,8 +363,13 @@ func handleClt(cc *clientConn) {
}
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.UnexpectedData})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
@@ -328,8 +397,13 @@ func handleClt(cc *clientConn) {
cc.log("<--", "invalid password")
ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.WrongPasswd})
- <-ack
- cc.Close()
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+ }
+
break
}
case *mt.ToSrvInit2: