OXIESEC PANEL
- Current Dir:
/
/
opt
/
golang
/
1.19.4
/
src
/
os
Server IP: 191.96.63.230
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
12/01/2022 06:13:58 PM
rwxr-xr-x
📄
dir.go
4.4 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
dir_darwin.go
2.92 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
dir_plan9.go
2.03 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
dir_unix.go
4.95 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
dir_windows.go
1.69 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
dirent_aix.go
759 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
dirent_dragonfly.go
1.28 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
dirent_freebsd.go
1.16 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
dirent_js.go
678 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
dirent_linux.go
1.18 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
dirent_netbsd.go
1.16 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
dirent_openbsd.go
1.16 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
dirent_solaris.go
759 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
endian_big.go
244 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
endian_little.go
304 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
env.go
3.84 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
env_test.go
5.03 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
env_unix_test.go
1.22 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
error.go
4.84 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
error_errno.go
247 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
error_plan9.go
234 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
error_posix.go
527 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
error_test.go
4.92 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
error_unix_test.go
1.48 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
error_windows_test.go
1.72 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
example_test.go
5.25 KB
12/01/2022 06:12:59 PM
rw-r--r--
📁
exec
-
12/01/2022 06:13:56 PM
rwxr-xr-x
📄
exec.go
5.95 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
exec_plan9.go
3.27 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
exec_posix.go
3.42 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
exec_unix.go
2.1 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
exec_unix_test.go
643 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
exec_windows.go
4.87 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable.go
774 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable_darwin.go
613 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable_dragonfly.go
293 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable_freebsd.go
292 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable_path.go
2.31 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable_plan9.go
427 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable_procfs.go
920 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable_solaris.go
695 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable_sysctl.go
891 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable_test.go
3.38 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
executable_windows.go
641 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
export_linux_test.go
216 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
export_test.go
395 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
export_unix_test.go
231 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
export_windows_test.go
349 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
fifo_test.go
1.78 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
file.go
22.12 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
file_plan9.go
14.91 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
file_posix.go
6.95 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
file_unix.go
12.09 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
file_windows.go
13.69 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
getwd.go
2.52 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
os_test.go
66.08 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
os_unix_test.go
8.4 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
os_windows_test.go
32.18 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
path.go
2.01 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
path_plan9.go
497 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
path_test.go
2.84 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
path_unix.go
1.55 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
path_windows.go
5.97 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
path_windows_test.go
2.73 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
pipe2_unix.go
658 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
pipe_test.go
11.1 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
pipe_unix.go
794 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
proc.go
2.09 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
rawconn.go
993 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
rawconn_test.go
1.13 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
read_test.go
3.04 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
readfrom_linux.go
1.03 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
readfrom_linux_test.go
9.58 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
readfrom_stub.go
302 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
removeall_at.go
4.73 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
removeall_noat.go
3.13 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
removeall_test.go
10.09 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
rlimit.go
1.24 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
rlimit_darwin.go
622 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
rlimit_stub.go
412 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
rlimit_test.go
927 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📁
signal
-
12/01/2022 06:13:56 PM
rwxr-xr-x
📄
stat.go
733 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_aix.go
1.18 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_darwin.go
1.09 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_dragonfly.go
1.06 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_freebsd.go
1.07 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_js.go
1.11 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_linux.go
1.06 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_netbsd.go
1.07 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_openbsd.go
1.06 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_plan9.go
2.29 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_solaris.go
1.3 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_test.go
5.98 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_unix.go
1.22 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
stat_windows.go
3.56 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
sticky_bsd.go
415 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
sticky_notbsd.go
320 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
str.go
817 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
sys.go
294 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
sys_aix.go
682 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
sys_bsd.go
456 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
sys_js.go
313 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
sys_linux.go
1.04 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
sys_plan9.go
453 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
sys_solaris.go
265 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
sys_unix.go
493 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
sys_windows.go
874 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
tempfile.go
3.84 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
tempfile_test.go
5.4 KB
12/01/2022 06:12:59 PM
rw-r--r--
📁
testdata
-
12/01/2022 06:13:56 PM
rwxr-xr-x
📄
timeout_test.go
17.04 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
types.go
2.79 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
types_plan9.go
815 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
types_unix.go
776 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
types_windows.go
6.31 KB
12/01/2022 06:12:59 PM
rw-r--r--
📁
user
-
12/01/2022 06:13:56 PM
rwxr-xr-x
📄
wait_unimp.go
899 bytes
12/01/2022 06:12:59 PM
rw-r--r--
📄
wait_wait6.go
1.48 KB
12/01/2022 06:12:59 PM
rw-r--r--
📄
wait_waitid.go
1.32 KB
12/01/2022 06:12:59 PM
rw-r--r--
Editing: readfrom_linux_test.go
Close
// Copyright 2020 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package os_test import ( "bytes" "internal/poll" "io" "math/rand" "os" . "os" "path/filepath" "strconv" "syscall" "testing" "time" ) func TestCopyFileRange(t *testing.T) { sizes := []int{ 1, 42, 1025, syscall.Getpagesize() + 1, 32769, } t.Run("Basic", func(t *testing.T) { for _, size := range sizes { t.Run(strconv.Itoa(size), func(t *testing.T) { testCopyFileRange(t, int64(size), -1) }) } }) t.Run("Limited", func(t *testing.T) { t.Run("OneLess", func(t *testing.T) { for _, size := range sizes { t.Run(strconv.Itoa(size), func(t *testing.T) { testCopyFileRange(t, int64(size), int64(size)-1) }) } }) t.Run("Half", func(t *testing.T) { for _, size := range sizes { t.Run(strconv.Itoa(size), func(t *testing.T) { testCopyFileRange(t, int64(size), int64(size)/2) }) } }) t.Run("More", func(t *testing.T) { for _, size := range sizes { t.Run(strconv.Itoa(size), func(t *testing.T) { testCopyFileRange(t, int64(size), int64(size)+7) }) } }) }) t.Run("DoesntTryInAppendMode", func(t *testing.T) { dst, src, data, hook := newCopyFileRangeTest(t, 42) dst2, err := OpenFile(dst.Name(), O_RDWR|O_APPEND, 0755) if err != nil { t.Fatal(err) } defer dst2.Close() if _, err := io.Copy(dst2, src); err != nil { t.Fatal(err) } if hook.called { t.Fatal("called poll.CopyFileRange for destination in O_APPEND mode") } mustSeekStart(t, dst2) mustContainData(t, dst2, data) // through traditional means }) t.Run("NotRegular", func(t *testing.T) { t.Run("BothPipes", func(t *testing.T) { hook := hookCopyFileRange(t) pr1, pw1, err := Pipe() if err != nil { t.Fatal(err) } defer pr1.Close() defer pw1.Close() pr2, pw2, err := Pipe() if err != nil { t.Fatal(err) } defer pr2.Close() defer pw2.Close() // The pipe is empty, and PIPE_BUF is large enough // for this, by (POSIX) definition, so there is no // need for an additional goroutine. data := []byte("hello") if _, err := pw1.Write(data); err != nil { t.Fatal(err) } pw1.Close() n, err := io.Copy(pw2, pr1) if err != nil { t.Fatal(err) } if n != int64(len(data)) { t.Fatalf("transferred %d, want %d", n, len(data)) } if !hook.called { t.Fatalf("should have called poll.CopyFileRange") } pw2.Close() mustContainData(t, pr2, data) }) t.Run("DstPipe", func(t *testing.T) { dst, src, data, hook := newCopyFileRangeTest(t, 255) dst.Close() pr, pw, err := Pipe() if err != nil { t.Fatal(err) } defer pr.Close() defer pw.Close() n, err := io.Copy(pw, src) if err != nil { t.Fatal(err) } if n != int64(len(data)) { t.Fatalf("transferred %d, want %d", n, len(data)) } if !hook.called { t.Fatalf("should have called poll.CopyFileRange") } pw.Close() mustContainData(t, pr, data) }) t.Run("SrcPipe", func(t *testing.T) { dst, src, data, hook := newCopyFileRangeTest(t, 255) src.Close() pr, pw, err := Pipe() if err != nil { t.Fatal(err) } defer pr.Close() defer pw.Close() // The pipe is empty, and PIPE_BUF is large enough // for this, by (POSIX) definition, so there is no // need for an additional goroutine. if _, err := pw.Write(data); err != nil { t.Fatal(err) } pw.Close() n, err := io.Copy(dst, pr) if err != nil { t.Fatal(err) } if n != int64(len(data)) { t.Fatalf("transferred %d, want %d", n, len(data)) } if !hook.called { t.Fatalf("should have called poll.CopyFileRange") } mustSeekStart(t, dst) mustContainData(t, dst, data) }) }) t.Run("Nil", func(t *testing.T) { var nilFile *File anyFile, err := os.CreateTemp("", "") if err != nil { t.Fatal(err) } defer Remove(anyFile.Name()) defer anyFile.Close() if _, err := io.Copy(nilFile, nilFile); err != ErrInvalid { t.Errorf("io.Copy(nilFile, nilFile) = %v, want %v", err, ErrInvalid) } if _, err := io.Copy(anyFile, nilFile); err != ErrInvalid { t.Errorf("io.Copy(anyFile, nilFile) = %v, want %v", err, ErrInvalid) } if _, err := io.Copy(nilFile, anyFile); err != ErrInvalid { t.Errorf("io.Copy(nilFile, anyFile) = %v, want %v", err, ErrInvalid) } if _, err := nilFile.ReadFrom(nilFile); err != ErrInvalid { t.Errorf("nilFile.ReadFrom(nilFile) = %v, want %v", err, ErrInvalid) } if _, err := anyFile.ReadFrom(nilFile); err != ErrInvalid { t.Errorf("anyFile.ReadFrom(nilFile) = %v, want %v", err, ErrInvalid) } if _, err := nilFile.ReadFrom(anyFile); err != ErrInvalid { t.Errorf("nilFile.ReadFrom(anyFile) = %v, want %v", err, ErrInvalid) } }) } func testCopyFileRange(t *testing.T, size int64, limit int64) { dst, src, data, hook := newCopyFileRangeTest(t, size) // If we have a limit, wrap the reader. var ( realsrc io.Reader lr *io.LimitedReader ) if limit >= 0 { lr = &io.LimitedReader{N: limit, R: src} realsrc = lr if limit < int64(len(data)) { data = data[:limit] } } else { realsrc = src } // Now call ReadFrom (through io.Copy), which will hopefully call // poll.CopyFileRange. n, err := io.Copy(dst, realsrc) if err != nil { t.Fatal(err) } // If we didn't have a limit, we should have called poll.CopyFileRange // with the right file descriptor arguments. if limit > 0 && !hook.called { t.Fatal("never called poll.CopyFileRange") } if hook.called && hook.dstfd != int(dst.Fd()) { t.Fatalf("wrong destination file descriptor: got %d, want %d", hook.dstfd, dst.Fd()) } if hook.called && hook.srcfd != int(src.Fd()) { t.Fatalf("wrong source file descriptor: got %d, want %d", hook.srcfd, src.Fd()) } // Check that the offsets after the transfer make sense, that the size // of the transfer was reported correctly, and that the destination // file contains exactly the bytes we expect it to contain. dstoff, err := dst.Seek(0, io.SeekCurrent) if err != nil { t.Fatal(err) } srcoff, err := src.Seek(0, io.SeekCurrent) if err != nil { t.Fatal(err) } if dstoff != srcoff { t.Errorf("offsets differ: dstoff = %d, srcoff = %d", dstoff, srcoff) } if dstoff != int64(len(data)) { t.Errorf("dstoff = %d, want %d", dstoff, len(data)) } if n != int64(len(data)) { t.Errorf("short ReadFrom: wrote %d bytes, want %d", n, len(data)) } mustSeekStart(t, dst) mustContainData(t, dst, data) // If we had a limit, check that it was updated. if lr != nil { if want := limit - n; lr.N != want { t.Fatalf("didn't update limit correctly: got %d, want %d", lr.N, want) } } } // newCopyFileRangeTest initializes a new test for copy_file_range. // // It creates source and destination files, and populates the source file // with random data of the specified size. It also hooks package os' call // to poll.CopyFileRange and returns the hook so it can be inspected. func newCopyFileRangeTest(t *testing.T, size int64) (dst, src *File, data []byte, hook *copyFileRangeHook) { t.Helper() hook = hookCopyFileRange(t) tmp := t.TempDir() src, err := Create(filepath.Join(tmp, "src")) if err != nil { t.Fatal(err) } t.Cleanup(func() { src.Close() }) dst, err = Create(filepath.Join(tmp, "dst")) if err != nil { t.Fatal(err) } t.Cleanup(func() { dst.Close() }) // Populate the source file with data, then rewind it, so it can be // consumed by copy_file_range(2). prng := rand.New(rand.NewSource(time.Now().Unix())) data = make([]byte, size) prng.Read(data) if _, err := src.Write(data); err != nil { t.Fatal(err) } if _, err := src.Seek(0, io.SeekStart); err != nil { t.Fatal(err) } return dst, src, data, hook } // mustContainData ensures that the specified file contains exactly the // specified data. func mustContainData(t *testing.T, f *File, data []byte) { t.Helper() got := make([]byte, len(data)) if _, err := io.ReadFull(f, got); err != nil { t.Fatal(err) } if !bytes.Equal(got, data) { t.Fatalf("didn't get the same data back from %s", f.Name()) } if _, err := f.Read(make([]byte, 1)); err != io.EOF { t.Fatalf("not at EOF") } } func mustSeekStart(t *testing.T, f *File) { if _, err := f.Seek(0, io.SeekStart); err != nil { t.Fatal(err) } } func hookCopyFileRange(t *testing.T) *copyFileRangeHook { h := new(copyFileRangeHook) h.install() t.Cleanup(h.uninstall) return h } type copyFileRangeHook struct { called bool dstfd int srcfd int remain int64 original func(dst, src *poll.FD, remain int64) (int64, bool, error) } func (h *copyFileRangeHook) install() { h.original = *PollCopyFileRangeP *PollCopyFileRangeP = func(dst, src *poll.FD, remain int64) (int64, bool, error) { h.called = true h.dstfd = dst.Sysfd h.srcfd = src.Sysfd h.remain = remain return h.original(dst, src, remain) } } 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) } }