From ed29cb2bec92569ff0b040e4b2d71532f3c394a7 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Thu, 19 Jan 2017 09:29:13 +0300 Subject: [PATCH] Lock map during read, to prevent concurrent access --- src/cypherpunks.ru/nncp/sp.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cypherpunks.ru/nncp/sp.go b/src/cypherpunks.ru/nncp/sp.go index 17f62c5..8b64be1 100644 --- a/src/cypherpunks.ru/nncp/sp.go +++ b/src/cypherpunks.ru/nncp/sp.go @@ -826,13 +826,16 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) { return nil, err } ourSize := uint64(file.Offset) + uint64(len(file.Payload)) + state.RLock() sdsp["fullsize"] = strconv.FormatInt(int64(state.infosTheir[*file.Hash].Size), 10) sdsp["size"] = strconv.FormatInt(int64(ourSize), 10) state.ctx.LogP("sp-file", sdsp, "") if state.infosTheir[*file.Hash].Size != ourSize { + state.RUnlock() fd.Close() continue } + state.RUnlock() go func() { if err := fd.Sync(); err != nil { state.ctx.LogE("sp-file", SdsAdd(sdsp, SDS{"err": err}), "sync") @@ -918,10 +921,12 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) { if infosGot { var pkts int var size uint64 + state.RLock() for _, info := range state.infosTheir { pkts++ size += info.Size } + state.RUnlock() state.ctx.LogI("sp-infos", SDS{ "xx": string(TRx), "node": state.Node.Id, -- 2.44.0