]> git.lizzy.rs Git - hydra-dragonfire.git/commitdiff
Fix deadlock on auth fail
authorElias Fleckenstein <eliasfleckenstein@web.de>
Wed, 8 Jun 2022 23:01:15 +0000 (01:01 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Wed, 8 Jun 2022 23:01:15 +0000 (01:01 +0200)
client.go
comp_auth.go
comp_pkts.go
map.go
path.go

index 889da387f9d0d1e7676b3ade111da26d29cbd18a..b177a073844805b4942bf5b3acfef2b80f073887 100644 (file)
--- a/client.go
+++ b/client.go
@@ -2,8 +2,8 @@ package main
 
 import (
        "errors"
-       "github.com/dragonfireclient/mt"
        "github.com/dragonfireclient/hydra-dragonfire/convert"
+       "github.com/dragonfireclient/mt"
        "github.com/yuin/gopher-lua"
        "net"
        "sync"
@@ -25,12 +25,13 @@ type Component interface {
 }
 
 type Client struct {
-       mu         sync.Mutex
        address    string
        state      clientState
        conn       mt.Peer
+       muConn     sync.Mutex
        queue      chan Event
        components map[string]Component
+       muComp     sync.Mutex
        table      *lua.LTable
        userdata   *lua.LUserData
 }
@@ -80,8 +81,8 @@ func getClients(l *lua.LState) []*Client {
 }
 
 func (client *Client) closeConn() {
-       client.mu.Lock()
-       defer client.mu.Unlock()
+       client.muConn.Lock()
+       defer client.muConn.Unlock()
 
        if client.state == csConnected {
                client.conn.Close()
@@ -165,11 +166,11 @@ func l_client_connect(l *lua.LState) int {
                        pkt, err := client.conn.Recv()
 
                        if err == nil {
-                               client.mu.Lock()
+                               client.muComp.Lock()
                                for _, comp := range client.components {
                                        comp.process(&pkt)
                                }
-                               client.mu.Unlock()
+                               client.muComp.Unlock()
                        } else if errors.Is(err, net.ErrClosed) {
                                client.queue <- EventDisconnect{client: client}
                                return
@@ -179,11 +180,11 @@ func l_client_connect(l *lua.LState) int {
                }
        }()
 
-       client.mu.Lock()
+       client.muComp.Lock()
        for _, comp := range client.components {
                comp.connect()
        }
-       client.mu.Unlock()
+       client.muComp.Unlock()
 
        return 0
 }
@@ -203,8 +204,8 @@ func l_client_enable(l *lua.LState) int {
        client := getClient(l)
        n := l.GetTop()
 
-       client.mu.Lock()
-       defer client.mu.Unlock()
+       client.muComp.Lock()
+       defer client.muComp.Unlock()
 
        for i := 2; i <= n; i++ {
                name := l.CheckString(i)
@@ -232,6 +233,9 @@ func l_client_enable(l *lua.LState) int {
 func l_client_send(l *lua.LState) int {
        client := getClient(l)
 
+       client.muConn.Lock()
+       defer client.muConn.Unlock()
+
        if client.state != csConnected {
                panic("not connected")
        }
@@ -239,9 +243,6 @@ func l_client_send(l *lua.LState) int {
        cmd := convert.ReadCmd(l)
        doAck := l.ToBool(4)
 
-       client.mu.Lock()
-       defer client.mu.Unlock()
-
        if client.state == csConnected {
                ack, err := client.conn.SendCmd(cmd)
                if err != nil && !errors.Is(err, net.ErrClosed) {
index a017cc7159268f9279765443151fcb4b001492c0..eeccc667282a221a069d08dc76691ec5daaa31d0 100644 (file)
@@ -2,8 +2,8 @@ package main
 
 import (
        "github.com/HimbeerserverDE/srp"
-       "github.com/dragonfireclient/mt"
        "github.com/dragonfireclient/hydra-dragonfire/convert"
+       "github.com/dragonfireclient/mt"
        "github.com/yuin/gopher-lua"
        "strings"
        "time"
index f135e6b9614c66f23d85ccdc39342ee49c78f989..7fc7e83d6f30e0943d145240767c1dfd32e32ab9 100644 (file)
@@ -1,8 +1,8 @@
 package main
 
 import (
-       "github.com/dragonfireclient/mt"
        "github.com/dragonfireclient/hydra-dragonfire/convert"
+       "github.com/dragonfireclient/mt"
        "github.com/yuin/gopher-lua"
        "sync"
 )
diff --git a/map.go b/map.go
index ad3cebf8b0946874a1cb3585213bffd096e91d0e..32dd7c39a4b7a51efdfec09f2d1b072eb275d34d 100644 (file)
--- a/map.go
+++ b/map.go
@@ -1,8 +1,8 @@
 package main
 
 import (
-       "github.com/dragonfireclient/mt"
        "github.com/dragonfireclient/hydra-dragonfire/convert"
+       "github.com/dragonfireclient/mt"
        "github.com/yuin/gopher-lua"
        "sync"
 )
diff --git a/path.go b/path.go
index bcdd910a9a4e894778148217480dca197c1bbc39..332a3259c920397aa7233c2470068d91bfc655ab 100644 (file)
--- a/path.go
+++ b/path.go
@@ -1,9 +1,9 @@
 package main
 
 import (
-       "github.com/dragonfireclient/mt"
        "github.com/beefsack/go-astar"
        "github.com/dragonfireclient/hydra-dragonfire/convert"
+       "github.com/dragonfireclient/mt"
        "github.com/yuin/gopher-lua"
        "math"
        "sync"