]> Cypherpunks.ru repositories - nncp.git/commitdiff
Fixed possible data race
authorSergey Matveev <stargrave@stargrave.org>
Thu, 22 Apr 2021 12:48:41 +0000 (15:48 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Thu, 22 Apr 2021 14:33:05 +0000 (17:33 +0300)
doc/news.ru.texi
doc/news.texi
ports/nncp/Makefile
src/nncp.go
src/sp.go

index ea1c700ff4acaf21a2e0ee9cdc851d999c896d4e..aa4f62ff76387a603924cd28342fcd39b94d85cd 100644 (file)
@@ -1,6 +1,16 @@
 @node Новости
 @section Новости
 
+@node Релиз 6.4.0
+@subsection Релиз 6.4.0
+@itemize
+
+@item
+Исправлена возможная гонка в online протоколе, приводящая к падению
+программы.
+
+@end itemize
+
 @node Релиз 6.3.0
 @subsection Релиз 6.3.0
 @itemize
index 87be65235774f1bbfe1be404a27ae220f6b5d9a0..67340e2ebb66abfe81239334ad790162e6b9fb0c 100644 (file)
@@ -3,6 +3,15 @@
 
 See also this page @ref{Новости, on russian}.
 
+@node Release 6.4.0
+@section Release 6.4.0
+@itemize
+
+@item
+Fixed possible race in online protocol, that lead to panic.
+
+@end itemize
+
 @node Release 6.3.0
 @section Release 6.3.0
 @itemize
index bb053c35eeca8faeabc53fe1a50c350a4a7d1163..c398830cbb65c6a315e27e4719bfe652eac4a8ff 100644 (file)
@@ -1,5 +1,5 @@
 PORTNAME=      nncp
-DISTVERSION=   6.3.0
+DISTVERSION=   6.4.0
 CATEGORIES=    net
 MASTER_SITES=  http://www.nncpgo.org/download/
 
index 12edaa40f73c52cf37e2b745a42f99455eedb7a9..7c1b7c576dd04da62f3e61662f21760ba01fe0e9 100644 (file)
@@ -40,7 +40,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.`
 const Base32Encoded32Len = 52
 
 var (
-       Version string = "6.3.0"
+       Version string = "6.4.0"
 
        Base32Codec *base32.Encoding = base32.StdEncoding.WithPadding(base32.NoPadding)
 )
index e6e4900a47052ceb81098d3e8d0f453889c48e7a..6d31375e137ff3a044d0bb5c1ad8ea4c481b4dd0 100644 (file)
--- a/src/sp.go
+++ b/src/sp.go
@@ -233,6 +233,7 @@ type SPState struct {
        onlyPkts       map[[32]byte]bool
        writeSPBuf     bytes.Buffer
        fds            map[string]FdAndFullSize
+       fdsLock        sync.RWMutex
        fileHashers    map[string]*HasherAndOffset
        checkerQueues  SPCheckerQueues
        sync.RWMutex
@@ -669,11 +670,12 @@ func (state *SPState) StartR(conn ConnDeadlined) error {
 }
 
 func (state *SPState) closeFd(pth string) {
-       s, exists := state.fds[pth]
-       delete(state.fds, pth)
-       if exists {
+       state.fdsLock.Lock()
+       if s, exists := state.fds[pth]; exists {
+               delete(state.fds, pth)
                s.fd.Close()
        }
+       state.fdsLock.Unlock()
 }
 
 func (state *SPState) StartWorkers(
@@ -914,7 +916,9 @@ func (state *SPState) StartWorkers(
                                        string(TTx),
                                        Base32Codec.EncodeToString(freq.Hash[:]),
                                )
+                               state.fdsLock.RLock()
                                fdAndFullSize, exists := state.fds[pth]
+                               state.fdsLock.RUnlock()
                                if !exists {
                                        fd, err := os.Open(pth)
                                        if err != nil {
@@ -931,7 +935,9 @@ func (state *SPState) StartWorkers(
                                                return
                                        }
                                        fdAndFullSize = FdAndFullSize{fd: fd, fullSize: fi.Size()}
+                                       state.fdsLock.Lock()
                                        state.fds[pth] = fdAndFullSize
+                                       state.fdsLock.Unlock()
                                }
                                fd := fdAndFullSize.fd
                                fullSize := fdAndFullSize.fullSize
@@ -1352,7 +1358,9 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                        state.Ctx.LogD("sp-file-open", lesp, func(les LEs) string {
                                return logMsg(les) + ": opening part"
                        })
+                       state.fdsLock.RLock()
                        fdAndFullSize, exists := state.fds[filePathPart]
+                       state.fdsLock.RUnlock()
                        var fd *os.File
                        if exists {
                                fd = fdAndFullSize.fd
@@ -1368,7 +1376,9 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                                        })
                                        return nil, err
                                }
+                               state.fdsLock.Lock()
                                state.fds[filePathPart] = FdAndFullSize{fd: fd}
+                               state.fdsLock.Unlock()
                                if file.Offset == 0 {
                                        h, err := blake2b.New256(nil)
                                        if err != nil {