From 33e9a35f08c3821f6683552fe767f80f82f49e0b Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Sun, 22 Jun 2014 08:17:58 +0200 Subject: [PATCH] Don't deadlock on connect close while sending Index (fixes #386) --- protocol/protocol.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/protocol/protocol.go b/protocol/protocol.go index 75c304d0..20ef8995 100644 --- a/protocol/protocol.go +++ b/protocol/protocol.go @@ -12,6 +12,7 @@ import ( "io" "sync" "time" + "github.com/calmh/syncthing/xdr" ) @@ -84,6 +85,8 @@ type rawConnection struct { awaiting []chan asyncResult imut sync.Mutex + idxMut sync.Mutex // ensures serialization of Index calls + nextID chan int outbox chan []encodable closed chan struct{} @@ -142,6 +145,9 @@ func (c *rawConnection) ID() string { // Index writes the list of file information to the connected peer node func (c *rawConnection) Index(repo string, idx []FileInfo) { + c.idxMut.Lock() + defer c.idxMut.Unlock() + c.imut.Lock() var msgType int if c.indexSent[repo] == nil { @@ -164,11 +170,11 @@ func (c *rawConnection) Index(repo string, idx []FileInfo) { } idx = diff } + c.imut.Unlock() if len(idx) > 0 { c.send(header{0, -1, msgType}, IndexMessage{repo, idx}) } - c.imut.Unlock() } // Request returns the bytes for the specified block after fetching them from the connected peer.