]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: close go.o before deleting it
authorAlex Brainman <alex.brainman@gmail.com>
Sun, 20 May 2018 04:53:00 +0000 (14:53 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Wed, 23 May 2018 09:44:27 +0000 (09:44 +0000)
Windows does not allow to delete opened file.

Fixes #24704

Change-Id: Idfca2d00a2c46bdd9bd2a721478bfd003c474ece
Reviewed-on: https://go-review.googlesource.com/113935
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/go/go_test.go
src/cmd/link/internal/ld/lib.go

index c05fab00fc4692a9de29b78a651f9b567be9fa2e..8022071bd822b5c0352b71b2bc79d1ee1326a892 100644 (file)
@@ -6244,3 +6244,47 @@ func TestNoRelativeTmpdir(t *testing.T) {
                tg.grepStderr("relative tmpdir", "wrong error")
        }
 }
+
+// Issue 24704.
+func TestLinkerTmpDirIsDeleted(t *testing.T) {
+       tg := testgo(t)
+       defer tg.cleanup()
+       tg.parallel()
+       tg.tempFile("a.go", `package main; import "C"; func main() {}`)
+       tg.run("build", "-ldflags", "-v", "-o", os.DevNull, tg.path("a.go"))
+       // Find line that has "host link:" in linker output.
+       stderr := tg.getStderr()
+       var hostLinkLine string
+       for _, line := range strings.Split(stderr, "\n") {
+               if !strings.Contains(line, "host link:") {
+                       continue
+               }
+               hostLinkLine = line
+               break
+       }
+       if hostLinkLine == "" {
+               t.Fatal(`fail to find with "host link:" string in linker output`)
+       }
+       // Find parameter, like "/tmp/go-link-408556474/go.o" inside of
+       // "host link:" line, and extract temp directory /tmp/go-link-408556474
+       // out of it.
+       tmpdir := hostLinkLine
+       i := strings.Index(tmpdir, `go.o"`)
+       if i == -1 {
+               t.Fatalf(`fail to find "go.o" in "host link:" line %q`, hostLinkLine)
+       }
+       tmpdir = tmpdir[:i-1]
+       i = strings.LastIndex(tmpdir, `"`)
+       if i == -1 {
+               t.Fatalf(`fail to find " in "host link:" line %q`, hostLinkLine)
+       }
+       tmpdir = tmpdir[i+1:]
+       // Verify that temp directory has been removed.
+       _, err := os.Stat(tmpdir)
+       if err == nil {
+               t.Fatalf("temp directory %q has not been removed", tmpdir)
+       }
+       if !os.IsNotExist(err) {
+               t.Fatalf("Stat(%q) returns unexpected error: %v", tmpdir, err)
+       }
+}
index d8c474f52c74f15801a31a60739c7d412de7ce07..edf39229806983fe04167378d17ceb7b412e0d4e 100644 (file)
@@ -921,12 +921,6 @@ func hostobjs(ctxt *Link) {
        }
 }
 
-// provided by lib9
-
-func rmtemp() {
-       os.RemoveAll(*flagTmpdir)
-}
-
 func hostlinksetup(ctxt *Link) {
        if ctxt.LinkMode != LinkExternal {
                return
@@ -945,7 +939,10 @@ func hostlinksetup(ctxt *Link) {
                        log.Fatal(err)
                }
                *flagTmpdir = dir
-               AtExit(rmtemp)
+               AtExit(func() {
+                       ctxt.Out.f.Close()
+                       os.RemoveAll(*flagTmpdir)
+               })
        }
 
        // change our output to temporary object file