cmd/go/internal/load: disallow import of mod/...
If that import succeeded it would address the module cache.
Change-Id: I3aaa0764c1cdcb1f7099b266edb2d56f53fda489
Reviewed-on: https://go-review.googlesource.com/122259
Reviewed-by: Bryan C. Mills <bcmills@google.com>
diff --git a/vendor/cmd/go/internal/load/pkg.go b/vendor/cmd/go/internal/load/pkg.go
index 8ccfb77..0a8eae6 100644
--- a/vendor/cmd/go/internal/load/pkg.go
+++ b/vendor/cmd/go/internal/load/pkg.go
@@ -425,6 +425,23 @@
stk.Push(path)
defer stk.Pop()
+ if strings.HasPrefix(path, "mod/") {
+ // Paths beginning with "mod/" might accidentally
+ // look in the module cache directory tree in $GOPATH/src/mod/.
+ // This prefix is owned by the Go core for possible use in the
+ // standard library (since it does not begin with a domain name),
+ // so it's OK to disallow entirely.
+ return &Package{
+ PackagePublic: PackagePublic{
+ ImportPath: path,
+ Error: &PackageError{
+ ImportStack: stk.Copy(),
+ Err: fmt.Sprintf("disallowed import path %q", path),
+ },
+ },
+ }
+ }
+
// Determine canonical identifier for this package.
// For a local import the identifier is the pseudo-import path
// we create from the full directory to the package.
diff --git a/vendor/cmd/go/vgo_test.go b/vendor/cmd/go/vgo_test.go
index fec216f..03840c0 100644
--- a/vendor/cmd/go/vgo_test.go
+++ b/vendor/cmd/go/vgo_test.go
@@ -102,6 +102,15 @@
}
}
+func TestImportModFails(t *testing.T) {
+ tg := testgo(t)
+ tg.setenv("GO111MODULE", "off") // testing GOPATH mode
+ defer tg.cleanup()
+
+ tg.runFail("list", "mod/foo")
+ tg.grepStderr(`disallowed import path`, "expected disallowed because of module cache")
+}
+
func TestModEdit(t *testing.T) {
// Test that local replacements work
// and that they can use a dummy name