diff options
author | Ayke van Laethem <[email protected]> | 2020-08-26 09:26:51 +0200 |
---|---|---|
committer | Ron Evans <[email protected]> | 2020-08-28 14:48:37 +0200 |
commit | 2194d447e9e0bf59e1ccea0870b920a4e7df1710 (patch) | |
tree | c768fb728a3c69caf2a526548a8af949e35fd067 /loader/goroot.go | |
parent | a21a039ac774e80d279cf946729ef409575150f8 (diff) | |
download | tinygo-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.go | 12 |
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 } |