From: Kelsey Hightower Date: Tue, 4 Mar 2014 17:00:45 +0000 (-0800) Subject: path/filepath: ensure Glob does not ignore broken symlinks X-Git-Tag: go1.3beta1~488 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=96c373f9e1eea8e13e1a8bcbfd1da8aada26fe90;p=gostls13.git path/filepath: ensure Glob does not ignore broken symlinks Fixes #6463. LGTM=bradfitz R=golang-codereviews, bradfitz CC=golang-codereviews https://golang.org/cl/69870050 --- diff --git a/src/pkg/path/filepath/match.go b/src/pkg/path/filepath/match.go index 3d84145d7f..a9bcc103c5 100644 --- a/src/pkg/path/filepath/match.go +++ b/src/pkg/path/filepath/match.go @@ -230,7 +230,7 @@ func getEsc(chunk string) (r rune, nchunk string, err error) { // func Glob(pattern string) (matches []string, err error) { if !hasMeta(pattern) { - if _, err = os.Stat(pattern); err != nil { + if _, err = os.Lstat(pattern); err != nil { return nil, nil } return []string{pattern}, nil diff --git a/src/pkg/path/filepath/match_test.go b/src/pkg/path/filepath/match_test.go index 13108ce1ef..daec81532d 100644 --- a/src/pkg/path/filepath/match_test.go +++ b/src/pkg/path/filepath/match_test.go @@ -2,9 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package filepath +package filepath_test import ( + "io/ioutil" + "os" + . "path/filepath" "runtime" "strings" "testing" @@ -153,3 +156,52 @@ func TestGlobError(t *testing.T) { t.Error("expected error for bad pattern; got none") } } + +var globSymlinkTests = []struct { + path, dest string + brokenLink bool +}{ + {"test1", "link1", false}, + {"test2", "link2", true}, +} + +func TestGlobSymlink(t *testing.T) { + switch runtime.GOOS { + case "windows", "plan9": + // The tests below are Unix specific so we skip plan9, which does not + // support symlinks, and windows. + t.Skipf("skipping test on %v", runtime.GOOS) + } + tmpDir, err := ioutil.TempDir("", "globsymlink") + if err != nil { + t.Fatal("creating temp dir:", err) + } + defer os.RemoveAll(tmpDir) + + for _, tt := range globSymlinkTests { + path := Join(tmpDir, tt.path) + dest := Join(tmpDir, tt.dest) + f, err := os.Create(path) + if err != nil { + t.Fatal(err) + } + if err := f.Close(); err != nil { + t.Fatal(err) + } + err = os.Symlink(path, dest) + if err != nil { + t.Fatal(err) + } + if tt.brokenLink { + // Break the symlink. + os.Remove(path) + } + matches, err := Glob(dest) + if err != nil { + t.Errorf("GlobSymlink error for %q: %s", dest, err) + } + if !contains(matches, dest) { + t.Errorf("Glob(%#q) = %#v want %v", dest, matches, dest) + } + } +}