]> Cypherpunks repositories - goredo.git/commitdiff
Fix concurrent writes to map v2.9.1
authorSergey Matveev <stargrave@stargrave.org>
Tue, 27 Jan 2026 09:50:28 +0000 (12:50 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Tue, 27 Jan 2026 09:50:28 +0000 (12:50 +0300)
doc/INSTALL
doc/NEWS
main.go
run.go
usage.go

index c488783eb806f83bd352bc5cc4c8e18670b3728d..b567c43d09338f3a72dde35df383b86e350523af 100644 (file)
@@ -11,7 +11,7 @@ Possibly goredo package already exists for your distribution:
 
 Preferable way is to [Download] tarball with the signature from website:
 
-    $ v=2.9.0
+    $ v=2.9.1
     $ [fetch|wget] http://www.goredo.cypherpunks.su/download/goredo-$v.tar.zst
     $ [fetch|wget] http://www.goredo.cypherpunks.su/download/goredo-$v.tar.zst.{asc,sig,cm}
     [Integrity] verify
index 636ae7843b3283cf4a5bb1ae1c35b59b69f3ae40..c07eb91dd349a5051e9a420d119f2ccf811b599b 100644 (file)
--- a/doc/NEWS
+++ b/doc/NEWS
@@ -1,3 +1,7 @@
+A 2.9.1\r
+2.9.1
+    * Fix possible panic.
+
 A 2.9.0\r
 2.9.0
     * Warn if non-top target did not write anything.
diff --git a/main.go b/main.go
index 52bb67930beb052f336ae7c8baccb6ae5be813ce..012da2e467a241be15e8c5206a85fb5d39337d13 100644 (file)
--- a/main.go
+++ b/main.go
@@ -318,6 +318,7 @@ func main() {
        go func() {
                <-killed
                tracef(CDebug, "[%s] killed", BuildUUID)
+               TmpsToCleanM.Lock()
                for fn := range TmpsToClean {
                        tracef(CDebug, "[%s] clean tempfile: %s", BuildUUID, fn)
                        os.Remove(fn)
diff --git a/run.go b/run.go
index 7db675244764f9e63195a3a0c9253841542a5888..7d0c66ab4142258bdf00d9d19f537b76503f8326 100644 (file)
--- a/run.go
+++ b/run.go
@@ -71,6 +71,7 @@ var (
        StopIfMod    = false
        Jobs         sync.WaitGroup
        TmpsToClean  = make(map[string]struct{})
+       TmpsToCleanM sync.Mutex
 
        flagTrace          *bool
        flagTraceAll       *bool
@@ -320,7 +321,11 @@ func runScript(tgt *Tgt, errs chan error, forced, traced bool) error {
                lockRelease()
                return TgtError{tgt, ErrLine(err)}
        }
-       TmpsToClean[fdDep.Name()] = struct{}{}
+       {
+               TmpsToCleanM.Lock()
+               TmpsToClean[fdDep.Name()] = struct{}{}
+               TmpsToCleanM.Unlock()
+       }
        fdDepOpened := true
        fdDepExists := true
        fdDepW := bufio.NewWriter(fdDep)
@@ -330,7 +335,11 @@ func runScript(tgt *Tgt, errs chan error, forced, traced bool) error {
                        fdDep.Close()
                }
                if fdDepExists {
-                       delete(TmpsToClean, fdDep.Name())
+                       {
+                               TmpsToCleanM.Lock()
+                               delete(TmpsToClean, fdDep.Name())
+                               TmpsToCleanM.Unlock()
+                       }
                        os.Remove(fdDep.Name())
                }
        }
@@ -410,7 +419,11 @@ func runScript(tgt *Tgt, errs chan error, forced, traced bool) error {
                cleanup()
                return TgtError{tgt, ErrLine(err)}
        }
-       TmpsToClean[fdStdout.Name()] = struct{}{}
+       {
+               TmpsToCleanM.Lock()
+               TmpsToClean[fdStdout.Name()] = struct{}{}
+               TmpsToCleanM.Unlock()
+       }
        fdStdout.Close()
        tmpPath := fdStdout.Name() + ".3" // and for $3
        tmpPathRel := mustRel(cwd, tmpPath)
@@ -611,13 +624,19 @@ func runScript(tgt *Tgt, errs chan error, forced, traced bool) error {
                        }
                        lockRelease()
                        if fdDepExists {
-                               delete(TmpsToClean, fdDep.Name())
                                os.Remove(fdDep.Name())
                        }
-                       delete(TmpsToClean, fdStdout.Name())
                        os.Remove(fdStdout.Name())
-                       delete(TmpsToClean, tmpPath)
                        os.Remove(tmpPath)
+                       {
+                               TmpsToCleanM.Lock()
+                               if fdDepExists {
+                                       delete(TmpsToClean, fdDep.Name())
+                               }
+                               delete(TmpsToClean, fdStdout.Name())
+                               delete(TmpsToClean, tmpPath)
+                               TmpsToCleanM.Unlock()
+                       }
                        if FdStatus != nil {
                                if _, err = FdStatus.Write([]byte{StatusDone}); err != nil {
                                        log.Fatal(err)
@@ -841,7 +860,11 @@ func runScript(tgt *Tgt, errs chan error, forced, traced bool) error {
                if err != nil {
                        goto Finish
                }
-               delete(TmpsToClean, fdDep.Name())
+               {
+                       TmpsToCleanM.Lock()
+                       delete(TmpsToClean, fdDep.Name())
+                       TmpsToCleanM.Unlock()
+               }
                fdDepExists = false
                if !NoSync {
                        err = ErrLine(syncDir(redoDir))
index d18f8f157764a9db9f5ef6530cb6553bfb74f0d8..3e66699fbb23ff546c21ce01465a59fe5b3d4103 100644 (file)
--- a/usage.go
+++ b/usage.go
@@ -24,7 +24,7 @@ import (
 )
 
 const (
-       Version  = "2.9.0"
+       Version  = "2.9.1"
        Warranty = `Copyright (C) 2020-2026 Sergey Matveev
 
 This program is free software: you can redistribute it and/or modify