cmd/go/internal/modfetch: make subdirectories unwritable too

The top-level directory in a module was marked unwritable
but not the subdirectories. Fix that.

Change-Id: Ia57e5343624753851d9fe1ddfe496b870b67f924
Reviewed-on: https://go-review.googlesource.com/124381
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
diff --git a/src/cmd/go/internal/modfetch/unzip.go b/src/cmd/go/internal/modfetch/unzip.go
index 7249761..a50431f 100644
--- a/src/cmd/go/internal/modfetch/unzip.go
+++ b/src/cmd/go/internal/modfetch/unzip.go
@@ -146,7 +146,7 @@
 
 	// Run over list backward to chmod children before parents.
 	for i := len(dirlist) - 1; i >= 0; i-- {
-		os.Chmod(dir, 0555)
+		os.Chmod(dirlist[i], 0555)
 	}
 
 	return nil
diff --git a/src/cmd/go/mod_test.go b/src/cmd/go/mod_test.go
index 946a7fb..a15832f 100644
--- a/src/cmd/go/mod_test.go
+++ b/src/cmd/go/mod_test.go
@@ -1037,8 +1037,7 @@
 	`), 0666))
 	tg.must(ioutil.WriteFile(tg.path("x/go.mod"), []byte(`
 		module x
-		require rsc.io/quote v1.5.1
-		replace rsc.io/sampler v1.3.0 => rsc.io/sampler v1.3.1
+		require rsc.io/quote v1.5.2
 	`), 0666))
 	tg.cd(tg.path("x"))
 
@@ -1051,7 +1050,7 @@
 	tg.grepStdoutNot(`quote@`, "should not have local copy of code")
 
 	tg.run("list", "-f={{.Dir}}", "rsc.io/quote") // downloads code to load package
-	tg.grepStdout(`mod[\\/]rsc.io[\\/]quote@v1.5.1`, "expected cached copy of code")
+	tg.grepStdout(`mod[\\/]rsc.io[\\/]quote@v1.5.2`, "expected cached copy of code")
 	dir := strings.TrimSpace(tg.getStdout())
 	info, err := os.Stat(dir)
 	if err != nil {
@@ -1060,7 +1059,21 @@
 	if info.Mode()&0222 != 0 {
 		t.Fatalf("%s should be unwritable", dir)
 	}
+	info, err = os.Stat(filepath.Join(dir, "buggy"))
+	if err != nil {
+		t.Fatal(err)
+	}
+	if info.Mode()&0222 != 0 {
+		t.Fatalf("%s should be unwritable", filepath.Join(dir, "buggy"))
+	}
 
+	tg.must(ioutil.WriteFile(tg.path("x/go.mod"), []byte(`
+		module x
+		require rsc.io/quote v1.5.1
+		replace rsc.io/sampler v1.3.0 => rsc.io/sampler v1.3.1
+	`), 0666))
+
+	tg.run("list", "-f={{.Dir}}", "rsc.io/quote") // downloads code to load package
 	tg.run("list", "-m", "-f={{.Path}} {{.Version}} {{.Dir}}{{with .Replace}} => {{.Version}} {{.Dir}}{{end}}", "all")
 	tg.grepStdout(`mod[\\/]rsc.io[\\/]quote@v1.5.1`, "expected cached copy of code")
 	tg.grepStdout(`v1.3.0 .*mod[\\/]rsc.io[\\/]sampler@v1.3.1 => v1.3.1 .*@v1.3.1`, "expected v1.3.1 replacement")