mirror of https://github.com/golang/go.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
This commit is contained in:
parent
5f1e0fa538
commit
96c373f9e1
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue