From: Nathan Caza Date: Sat, 11 Feb 2017 03:09:21 +0000 (-0600) Subject: net/http: handle absolute paths in mapDirOpenError X-Git-Tag: go1.9beta1~1570 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a610957f2e48c5b917126b1d0b5f930f05ca8841;p=gostls13.git net/http: handle absolute paths in mapDirOpenError The current implementation does not account for Dir being initialized with an absolute path on systems that start paths with filepath.Separator. In this scenario, the original error is returned, and not checked for file segments. This change adds a test for this case, and corrects the behavior by ignoring blank path segments in the loop. Refs #18984 Change-Id: I9b79fd0a73a46976c8e2feda0283ef0bb2b62ea1 Reviewed-on: https://go-review.googlesource.com/36804 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- diff --git a/src/net/http/fs.go b/src/net/http/fs.go index 773e74d536..2858319450 100644 --- a/src/net/http/fs.go +++ b/src/net/http/fs.go @@ -43,6 +43,9 @@ func mapDirOpenError(originalErr error, name string) error { parts := strings.Split(name, string(filepath.Separator)) for i := range parts { + if parts[i] == "" { + continue + } fi, err := os.Stat(strings.Join(parts[:i+1], string(filepath.Separator))) if err != nil { return originalErr diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go index 8ff2faf9b9..1de1cd53d0 100644 --- a/src/net/http/fs_test.go +++ b/src/net/http/fs_test.go @@ -1176,22 +1176,33 @@ func TestFileServerNotDirError(t *testing.T) { t.Errorf("StatusCode = %v; want 404", res.StatusCode) } - dir := Dir("testdata") - _, err = dir.Open("/index.html/not-a-file") - if err == nil { - t.Fatal("err == nil; want != nil") - } - if !os.IsNotExist(err) { - t.Errorf("err = %v; os.IsNotExist(err) = %v; want true", err, os.IsNotExist(err)) - } + test := func(name string, dir Dir) { + t.Run(name, func(t *testing.T) { + _, err = dir.Open("/index.html/not-a-file") + if err == nil { + t.Fatal("err == nil; want != nil") + } + if !os.IsNotExist(err) { + t.Errorf("err = %v; os.IsNotExist(err) = %v; want true", err, os.IsNotExist(err)) + } - _, err = dir.Open("/index.html/not-a-dir/not-a-file") - if err == nil { - t.Fatal("err == nil; want != nil") + _, err = dir.Open("/index.html/not-a-dir/not-a-file") + if err == nil { + t.Fatal("err == nil; want != nil") + } + if !os.IsNotExist(err) { + t.Errorf("err = %v; os.IsNotExist(err) = %v; want true", err, os.IsNotExist(err)) + } + }) } - if !os.IsNotExist(err) { - t.Errorf("err = %v; os.IsNotExist(err) = %v; want true", err, os.IsNotExist(err)) + + absPath, err := filepath.Abs("testdata") + if err != nil { + t.Fatal("get abs path:", err) } + + test("RelativePath", Dir("testdata")) + test("AbsolutePath", Dir(absPath)) } func TestFileServerCleanPath(t *testing.T) {