]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: fix vendor-related index out of range panic on bad file tree
authorRuss Cox <rsc@golang.org>
Tue, 18 Aug 2015 01:26:45 +0000 (21:26 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 18 Aug 2015 13:53:28 +0000 (13:53 +0000)
Fixes #12156.

Change-Id: I2d71163b98bcc770147eb9e78dc551a9d0b5b817
Reviewed-on: https://go-review.googlesource.com/13674
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/go/pkg.go
src/cmd/go/testdata/testvendor2/src/p/p.go [new file with mode: 0644]
src/cmd/go/testdata/testvendor2/vendor/x/x.go [new file with mode: 0644]
src/cmd/go/vendor_test.go

index 5dd23526068173f80d6e279a2940c0a349a3bdfb..61e3d8dc702ca06f31e778b900c344fb7f18fa7f 100644 (file)
@@ -416,7 +416,7 @@ func vendoredImportPath(parent *Package, path string) (found string, searched []
                return path, nil
        }
        dir := filepath.Clean(parent.Dir)
-       root := filepath.Clean(parent.Root)
+       root := filepath.Join(parent.Root, "src")
        if !hasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator {
                fatalf("invalid vendoredImportPath: dir=%q root=%q separator=%q", dir, root, string(filepath.Separator))
        }
diff --git a/src/cmd/go/testdata/testvendor2/src/p/p.go b/src/cmd/go/testdata/testvendor2/src/p/p.go
new file mode 100644 (file)
index 0000000..220b2b2
--- /dev/null
@@ -0,0 +1,3 @@
+package p
+
+import "x"
diff --git a/src/cmd/go/testdata/testvendor2/vendor/x/x.go b/src/cmd/go/testdata/testvendor2/vendor/x/x.go
new file mode 100644 (file)
index 0000000..823aafd
--- /dev/null
@@ -0,0 +1 @@
+package x
index 611aceb999db811b4d97e326784c8f88a12b1c93..1e8cf9c8d26d7531fbc5520f5819362c5b21e2a3 100644 (file)
@@ -244,3 +244,15 @@ func TestVendorList(t *testing.T) {
        tg.run("list", "-f", `{{join .XTestImports "\n"}}`, "github.com/rsc/go-get-issue-11864/vendor/vendor.org/tx3")
        tg.grepStdout("go-get-issue-11864/vendor/vendor.org/tx3", "did not find vendor-expanded tx3")
 }
+
+func TestVendor12156(t *testing.T) {
+       // Former index out of range panic.
+       tg := testgo(t)
+       defer tg.cleanup()
+       tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata/testvendor2"))
+       tg.setenv("GO15VENDOREXPERIMENT", "1")
+       tg.cd(filepath.Join(tg.pwd(), "testdata/testvendor2/src/p"))
+       tg.runFail("build", "p.go")
+       tg.grepStderrNot("panic", "panicked")
+       tg.grepStderr(`cannot find package "x"`, "wrong error")
+}