]> Cypherpunks.ru repositories - gostls13.git/commitdiff
net/http: handle absolute paths in mapDirOpenError
authorNathan Caza <mastercactapus@gmail.com>
Sat, 11 Feb 2017 03:09:21 +0000 (21:09 -0600)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 14 Feb 2017 04:41:36 +0000 (04:41 +0000)
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 <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/http/fs.go
src/net/http/fs_test.go

index 773e74d536d68d2f7da47fad4394ae24b540dd49..2858319450520c881884981f67563d97c2b54237 100644 (file)
@@ -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
index 8ff2faf9b90f081a53a0de4b36d8870eb3ccf54b..1de1cd53d098b5397a893e86661f6d31724520d5 100644 (file)
@@ -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) {