Skip to content

Commit 77d797e

Browse files
simar7gopherbot
authored andcommitted
sumdb/dirhash: fix a panic when argument is not a directory
This patch fixes a case where a path to a non directory can cause DirHash func to panic. Fixes golang/go#57269 Change-Id: I743970dcafdf3bfee94baf4b714429a404decda9 GitHub-Last-Rev: a17ca1a GitHub-Pull-Request: #16 Reviewed-on: https://go-review.googlesource.com/c/mod/+/457075 Run-TryBot: Bryan Mills <[email protected]> Auto-Submit: Bryan Mills <[email protected]> Reviewed-by: Benny Siegert <[email protected]> Reviewed-by: Bryan Mills <[email protected]> TryBot-Result: Gopher Robot <[email protected]>
1 parent 7c05a44 commit 77d797e

File tree

2 files changed

+47
-26
lines changed

2 files changed

+47
-26
lines changed

sumdb/dirhash/hash.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,10 @@ func DirFiles(dir, prefix string) ([]string, error) {
9090
}
9191
if info.IsDir() {
9292
return nil
93+
} else if file == dir {
94+
return fmt.Errorf("%s is not a directory", dir)
9395
}
96+
9497
rel := file
9598
if dir != "." {
9699
rel = file[len(dir)+1:]

sumdb/dirhash/hash_test.go

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -105,31 +105,49 @@ func TestHashZip(t *testing.T) {
105105
}
106106

107107
func TestDirFiles(t *testing.T) {
108-
dir, err := ioutil.TempDir("", "dirfiles-test-")
109-
if err != nil {
110-
t.Fatal(err)
111-
}
112-
defer os.RemoveAll(dir)
113-
if err := ioutil.WriteFile(filepath.Join(dir, "xyz"), []byte("data for xyz"), 0666); err != nil {
114-
t.Fatal(err)
115-
}
116-
if err := ioutil.WriteFile(filepath.Join(dir, "abc"), []byte("data for abc"), 0666); err != nil {
117-
t.Fatal(err)
118-
}
119-
if err := os.Mkdir(filepath.Join(dir, "subdir"), 0777); err != nil {
120-
t.Fatal(err)
121-
}
122-
if err := ioutil.WriteFile(filepath.Join(dir, "subdir", "xyz"), []byte("data for subdir xyz"), 0666); err != nil {
123-
t.Fatal(err)
124-
}
125-
prefix := "foo/[email protected]"
126-
out, err := DirFiles(dir, prefix)
127-
if err != nil {
128-
t.Fatalf("DirFiles: %v", err)
129-
}
130-
for _, file := range out {
131-
if !strings.HasPrefix(file, prefix) {
132-
t.Errorf("Dir file = %s, want prefix %s", file, prefix)
108+
t.Run("valid directory with files", func(t *testing.T) {
109+
dir, err := ioutil.TempDir("", "dirfiles-test-")
110+
if err != nil {
111+
t.Fatal(err)
133112
}
134-
}
113+
defer os.RemoveAll(dir)
114+
if err := ioutil.WriteFile(filepath.Join(dir, "xyz"), []byte("data for xyz"), 0666); err != nil {
115+
t.Fatal(err)
116+
}
117+
if err := ioutil.WriteFile(filepath.Join(dir, "abc"), []byte("data for abc"), 0666); err != nil {
118+
t.Fatal(err)
119+
}
120+
if err := os.Mkdir(filepath.Join(dir, "subdir"), 0777); err != nil {
121+
t.Fatal(err)
122+
}
123+
if err := ioutil.WriteFile(filepath.Join(dir, "subdir", "xyz"), []byte("data for subdir xyz"), 0666); err != nil {
124+
t.Fatal(err)
125+
}
126+
prefix := "foo/[email protected]"
127+
out, err := DirFiles(dir, prefix)
128+
if err != nil {
129+
t.Fatalf("DirFiles: %v", err)
130+
}
131+
for _, file := range out {
132+
if !strings.HasPrefix(file, prefix) {
133+
t.Errorf("Dir file = %s, want prefix %s", file, prefix)
134+
}
135+
}
136+
})
137+
138+
t.Run("invalid directory", func(t *testing.T) {
139+
path := filepath.Join(t.TempDir(), "not-a-directory.txt")
140+
if err := os.WriteFile(path, []byte("This is a file."), 0644); err != nil {
141+
t.Fatal(err)
142+
}
143+
defer os.RemoveAll(path)
144+
145+
out, err := DirFiles(path, "")
146+
if err == nil {
147+
t.Errorf("DirFiles(...) = %v, expected an error", err)
148+
}
149+
if len(out) > 0 {
150+
t.Errorf("DirFiles(...) = unexpected files %s", out)
151+
}
152+
})
135153
}

0 commit comments

Comments
 (0)