diff options
author | Ian Lance Taylor <iant@golang.org> | 2021-02-18 18:54:38 -0800 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2021-02-19 12:33:25 -0800 |
commit | 13e6fadd96dc00c611a3d2f26a1a6d7a0a29ea27 (patch) | |
tree | 658d732faec422de82b372ad60e76bc6f1277689 /libgo/go/os | |
parent | af027826292351218785f893d1c42fe28ae3ed9f (diff) | |
download | gcc-13e6fadd96dc00c611a3d2f26a1a6d7a0a29ea27.zip gcc-13e6fadd96dc00c611a3d2f26a1a6d7a0a29ea27.tar.gz gcc-13e6fadd96dc00c611a3d2f26a1a6d7a0a29ea27.tar.bz2 |
libgo: update to Go1.16 release
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/293793
Diffstat (limited to 'libgo/go/os')
-rw-r--r-- | libgo/go/os/file.go | 13 | ||||
-rw-r--r-- | libgo/go/os/os_test.go | 34 | ||||
-rw-r--r-- | libgo/go/os/readfrom_linux_test.go | 32 |
3 files changed, 78 insertions, 1 deletions
diff --git a/libgo/go/os/file.go b/libgo/go/os/file.go index 416bc0e..52dd943 100644 --- a/libgo/go/os/file.go +++ b/libgo/go/os/file.go @@ -620,10 +620,21 @@ func DirFS(dir string) fs.FS { return dirFS(dir) } +func containsAny(s, chars string) bool { + for i := 0; i < len(s); i++ { + for j := 0; j < len(chars); j++ { + if s[i] == chars[j] { + return true + } + } + } + return false +} + type dirFS string func (dir dirFS) Open(name string) (fs.File, error) { - if !fs.ValidPath(name) { + if !fs.ValidPath(name) || runtime.GOOS == "windows" && containsAny(name, `\:`) { return nil, &PathError{Op: "open", Path: name, Err: ErrInvalid} } f, err := Open(string(dir) + "/" + name) diff --git a/libgo/go/os/os_test.go b/libgo/go/os/os_test.go index 40ba056..734c655 100644 --- a/libgo/go/os/os_test.go +++ b/libgo/go/os/os_test.go @@ -2721,6 +2721,40 @@ func TestDirFS(t *testing.T) { if err := fstest.TestFS(DirFS("./testdata/dirfs"), "a", "b", "dir/x"); err != nil { t.Fatal(err) } + + // Test that Open does not accept backslash as separator. + d := DirFS(".") + _, err := d.Open(`testdata\dirfs`) + if err == nil { + t.Fatalf(`Open testdata\dirfs succeeded`) + } +} + +func TestDirFSPathsValid(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skipf("skipping on Windows") + } + + d := t.TempDir() + if err := os.WriteFile(filepath.Join(d, "control.txt"), []byte(string("Hello, world!")), 0644); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(d, `e:xperi\ment.txt`), []byte(string("Hello, colon and backslash!")), 0644); err != nil { + t.Fatal(err) + } + + fsys := os.DirFS(d) + err := fs.WalkDir(fsys, ".", func(path string, e fs.DirEntry, err error) error { + if fs.ValidPath(e.Name()) { + t.Logf("%q ok", e.Name()) + } else { + t.Errorf("%q INVALID", e.Name()) + } + return nil + }) + if err != nil { + t.Fatal(err) + } } func TestReadFileProc(t *testing.T) { diff --git a/libgo/go/os/readfrom_linux_test.go b/libgo/go/os/readfrom_linux_test.go index 3704717..1d145da 100644 --- a/libgo/go/os/readfrom_linux_test.go +++ b/libgo/go/os/readfrom_linux_test.go @@ -361,3 +361,35 @@ func (h *copyFileRangeHook) install() { func (h *copyFileRangeHook) uninstall() { *PollCopyFileRangeP = h.original } + +// On some kernels copy_file_range fails on files in /proc. +func TestProcCopy(t *testing.T) { + const cmdlineFile = "/proc/self/cmdline" + cmdline, err := os.ReadFile(cmdlineFile) + if err != nil { + t.Skipf("can't read /proc file: %v", err) + } + in, err := os.Open(cmdlineFile) + if err != nil { + t.Fatal(err) + } + defer in.Close() + outFile := filepath.Join(t.TempDir(), "cmdline") + out, err := os.Create(outFile) + if err != nil { + t.Fatal(err) + } + if _, err := io.Copy(out, in); err != nil { + t.Fatal(err) + } + if err := out.Close(); err != nil { + t.Fatal(err) + } + copy, err := os.ReadFile(outFile) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(cmdline, copy) { + t.Errorf("copy of %q got %q want %q\n", cmdlineFile, copy, cmdline) + } +} |