aboutsummaryrefslogtreecommitdiffhomepage
path: root/loader/goroot.go
diff options
context:
space:
mode:
authorAyke van Laethem <[email protected]>2020-08-26 09:26:51 +0200
committerRon Evans <[email protected]>2020-08-28 14:48:37 +0200
commit2194d447e9e0bf59e1ccea0870b920a4e7df1710 (patch)
treec768fb728a3c69caf2a526548a8af949e35fd067 /loader/goroot.go
parenta21a039ac774e80d279cf946729ef409575150f8 (diff)
downloadtinygo-2194d447e9e0bf59e1ccea0870b920a4e7df1710.tar.gz
tinygo-2194d447e9e0bf59e1ccea0870b920a4e7df1710.zip
loader: use ioutil.TempDir to create a temporary directory
... instead of generating one with math/rand. The problem was that math/rand is deterministic across runs, resulting in a possible race when trying to create the same directory between two processes. Additionally, because I used `os.MkdirAll`, no error was reported when the directory already existed. The solution to this is to use the stdlib function designed for this: ioutil.TempDir.
Diffstat (limited to 'loader/goroot.go')
-rw-r--r--loader/goroot.go12
1 files changed, 7 insertions, 5 deletions
diff --git a/loader/goroot.go b/loader/goroot.go
index 621b92cb3..d1c5d1c31 100644
--- a/loader/goroot.go
+++ b/loader/goroot.go
@@ -10,13 +10,11 @@ import (
"fmt"
"io"
"io/ioutil"
- "math/rand"
"os"
"os/exec"
"path"
"path/filepath"
"runtime"
- "strconv"
"github.com/tinygo-org/tinygo/compileopts"
"github.com/tinygo-org/tinygo/goenv"
@@ -50,7 +48,8 @@ func GetCachedGoroot(config *compileopts.Config) (string, error) {
fmt.Fprintln(hash, tinygoroot)
gorootsHash := hash.Sum(nil)
gorootsHashHex := hex.EncodeToString(gorootsHash[:])
- cachedgoroot := filepath.Join(goenv.Get("GOCACHE"), "goroot-"+version+"-"+gorootsHashHex)
+ cachedgorootName := "goroot-" + version + "-" + gorootsHashHex
+ cachedgoroot := filepath.Join(goenv.Get("GOCACHE"), cachedgorootName)
if needsSyscallPackage(config.BuildTags()) {
cachedgoroot += "-syscall"
}
@@ -58,8 +57,11 @@ func GetCachedGoroot(config *compileopts.Config) (string, error) {
if _, err := os.Stat(cachedgoroot); err == nil {
return cachedgoroot, nil
}
- tmpgoroot := cachedgoroot + ".tmp" + strconv.Itoa(rand.Int())
- err = os.MkdirAll(tmpgoroot, 0777)
+ err = os.MkdirAll(goenv.Get("GOCACHE"), 0777)
+ if err != nil {
+ return "", err
+ }
+ tmpgoroot, err := ioutil.TempDir(goenv.Get("GOCACHE"), cachedgorootName+".tmp")
if err != nil {
return "", err
}