mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
[syserror] Update syserror to linuxerr for more errors.
Update the following from syserror to the linuxerr equivalent: EEXIST EFAULT ENOTDIR ENOTTY EOPNOTSUPP ERANGE ESRCH PiperOrigin-RevId: 384329869
This commit is contained in:
committed by
gVisor bot
parent
ebe99977a4
commit
e3fdd15932
@@ -277,13 +277,13 @@ func TestEqualsMethod(t *testing.T) {
|
||||
{
|
||||
name: "equal errors",
|
||||
linuxErr: []*gErrors.Error{linuxerr.ESRCH},
|
||||
err: []error{linuxerr.ESRCH, syserror.ESRCH, unix.Errno(linuxerr.ESRCH.Errno())},
|
||||
err: []error{linuxerr.ESRCH, linuxerr.ESRCH, unix.Errno(linuxerr.ESRCH.Errno())},
|
||||
equal: true,
|
||||
},
|
||||
{
|
||||
name: "unequal errors",
|
||||
linuxErr: []*gErrors.Error{linuxerr.ENOENT},
|
||||
err: []error{linuxerr.ESRCH, syserror.ESRCH, unix.Errno(linuxerr.ESRCH.Errno())},
|
||||
err: []error{linuxerr.ESRCH, linuxerr.ESRCH, unix.Errno(linuxerr.ESRCH.Errno())},
|
||||
equal: false,
|
||||
},
|
||||
{
|
||||
|
||||
@@ -35,7 +35,6 @@ go_library(
|
||||
"//pkg/marshal/primitive",
|
||||
"//pkg/sentry/arch/fpu",
|
||||
"//pkg/sentry/limits",
|
||||
"//pkg/syserror",
|
||||
"//pkg/usermem",
|
||||
"@org_golang_x_sys//unix:go_default_library",
|
||||
],
|
||||
|
||||
@@ -26,7 +26,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/log"
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch/fpu"
|
||||
rpb "gvisor.dev/gvisor/pkg/sentry/arch/registers_go_proto"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
)
|
||||
|
||||
// Registers represents the CPU registers for this architecture.
|
||||
@@ -234,7 +233,7 @@ func (s *State) PtraceGetRegSet(regset uintptr, dst io.Writer, maxlen int) (int,
|
||||
switch regset {
|
||||
case _NT_PRSTATUS:
|
||||
if maxlen < ptraceRegistersSize {
|
||||
return 0, syserror.EFAULT
|
||||
return 0, linuxerr.EFAULT
|
||||
}
|
||||
return s.PtraceGetRegs(dst)
|
||||
default:
|
||||
@@ -247,7 +246,7 @@ func (s *State) PtraceSetRegSet(regset uintptr, src io.Reader, maxlen int) (int,
|
||||
switch regset {
|
||||
case _NT_PRSTATUS:
|
||||
if maxlen < ptraceRegistersSize {
|
||||
return 0, syserror.EFAULT
|
||||
return 0, linuxerr.EFAULT
|
||||
}
|
||||
return s.PtraceSetRegs(src)
|
||||
default:
|
||||
|
||||
@@ -27,7 +27,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/log"
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch/fpu"
|
||||
rpb "gvisor.dev/gvisor/pkg/sentry/arch/registers_go_proto"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
)
|
||||
|
||||
// Registers represents the CPU registers for this architecture.
|
||||
@@ -354,7 +353,7 @@ func (s *State) PtraceGetRegSet(regset uintptr, dst io.Writer, maxlen int) (int,
|
||||
switch regset {
|
||||
case _NT_PRSTATUS:
|
||||
if maxlen < ptraceRegistersSize {
|
||||
return 0, syserror.EFAULT
|
||||
return 0, linuxerr.EFAULT
|
||||
}
|
||||
return s.PtraceGetRegs(dst)
|
||||
case _NT_PRFPREG:
|
||||
@@ -371,7 +370,7 @@ func (s *State) PtraceSetRegSet(regset uintptr, src io.Reader, maxlen int) (int,
|
||||
switch regset {
|
||||
case _NT_PRSTATUS:
|
||||
if maxlen < ptraceRegistersSize {
|
||||
return 0, syserror.EFAULT
|
||||
return 0, linuxerr.EFAULT
|
||||
}
|
||||
return s.PtraceSetRegs(src)
|
||||
case _NT_PRFPREG:
|
||||
|
||||
@@ -13,9 +13,9 @@ go_library(
|
||||
visibility = ["//:sandbox"],
|
||||
deps = [
|
||||
"//pkg/cpuid",
|
||||
"//pkg/errors/linuxerr",
|
||||
"//pkg/hostarch",
|
||||
"//pkg/sync",
|
||||
"//pkg/syserror",
|
||||
"@org_golang_x_sys//unix:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -21,9 +21,9 @@ import (
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
"gvisor.dev/gvisor/pkg/cpuid"
|
||||
"gvisor.dev/gvisor/pkg/errors/linuxerr"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/sync"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
)
|
||||
|
||||
// initX86FPState (defined in asm files) sets up initial state.
|
||||
@@ -70,7 +70,7 @@ const ptraceFPRegsSize = 512
|
||||
// PtraceGetFPRegs implements Context.PtraceGetFPRegs.
|
||||
func (s *State) PtraceGetFPRegs(dst io.Writer, maxlen int) (int, error) {
|
||||
if maxlen < ptraceFPRegsSize {
|
||||
return 0, syserror.EFAULT
|
||||
return 0, linuxerr.EFAULT
|
||||
}
|
||||
|
||||
return dst.Write((*s)[:ptraceFPRegsSize])
|
||||
@@ -79,7 +79,7 @@ func (s *State) PtraceGetFPRegs(dst io.Writer, maxlen int) (int, error) {
|
||||
// PtraceSetFPRegs implements Context.PtraceSetFPRegs.
|
||||
func (s *State) PtraceSetFPRegs(src io.Reader, maxlen int) (int, error) {
|
||||
if maxlen < ptraceFPRegsSize {
|
||||
return 0, syserror.EFAULT
|
||||
return 0, linuxerr.EFAULT
|
||||
}
|
||||
|
||||
var f [ptraceFPRegsSize]byte
|
||||
|
||||
@@ -17,7 +17,6 @@ go_library(
|
||||
"//pkg/sentry/kernel",
|
||||
"//pkg/sentry/socket/netstack",
|
||||
"//pkg/sentry/vfs",
|
||||
"//pkg/syserror",
|
||||
"//pkg/tcpip/link/tun",
|
||||
"//pkg/usermem",
|
||||
"//pkg/waiter",
|
||||
|
||||
@@ -26,7 +26,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.dev/gvisor/pkg/sentry/socket/netstack"
|
||||
"gvisor.dev/gvisor/pkg/sentry/vfs"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/link/tun"
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
"gvisor.dev/gvisor/pkg/waiter"
|
||||
@@ -105,7 +104,7 @@ func (fd *tunFD) Ioctl(ctx context.Context, uio usermem.IO, args arch.SyscallArg
|
||||
return 0, err
|
||||
|
||||
default:
|
||||
return 0, syserror.ENOTTY
|
||||
return 0, linuxerr.ENOTTY
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/inet"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.dev/gvisor/pkg/sentry/socket/netstack"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/link/tun"
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
"gvisor.dev/gvisor/pkg/waiter"
|
||||
@@ -126,7 +125,7 @@ func (n *netTunFileOperations) Ioctl(ctx context.Context, file *fs.File, io user
|
||||
return 0, err
|
||||
|
||||
default:
|
||||
return 0, syserror.ENOTTY
|
||||
return 0, linuxerr.ENOTTY
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -864,7 +864,7 @@ func direntReaddir(ctx context.Context, d *Dirent, it DirIterator, root *Dirent,
|
||||
// Once we have written entries for "." and "..", future errors from
|
||||
// IterateDir will be hidden.
|
||||
if !IsDir(d.Inode.StableAttr) {
|
||||
return 0, syserror.ENOTDIR
|
||||
return 0, linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// This is a special case for lseek(fd, 0, SEEK_END).
|
||||
|
||||
@@ -408,7 +408,7 @@ func (f *overlayFileOperations) Ioctl(ctx context.Context, overlayFile *File, io
|
||||
// copy up on any ioctl would be too drastic. In the future, it can have a
|
||||
// list of ioctls that are safe to send to lower and a list that triggers a
|
||||
// copy up.
|
||||
return 0, syserror.ENOTTY
|
||||
return 0, linuxerr.ENOTTY
|
||||
}
|
||||
return f.upper.FileOperations.Ioctl(ctx, f.upper, io, args)
|
||||
}
|
||||
|
||||
@@ -107,13 +107,13 @@ go_test(
|
||||
library = ":fsutil",
|
||||
deps = [
|
||||
"//pkg/context",
|
||||
"//pkg/errors/linuxerr",
|
||||
"//pkg/hostarch",
|
||||
"//pkg/safemem",
|
||||
"//pkg/sentry/contexttest",
|
||||
"//pkg/sentry/fs",
|
||||
"//pkg/sentry/kernel/time",
|
||||
"//pkg/sentry/memmap",
|
||||
"//pkg/syserror",
|
||||
"//pkg/usermem",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -170,7 +170,7 @@ type FileNotDirReaddir struct{}
|
||||
|
||||
// Readdir implements fs.FileOperations.FileNotDirReaddir.
|
||||
func (FileNotDirReaddir) Readdir(context.Context, *fs.File, fs.DentrySerializer) (int64, error) {
|
||||
return 0, syserror.ENOTDIR
|
||||
return 0, linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// FileNoFsync implements fs.FileOperations.Fsync for files that don't support
|
||||
@@ -223,7 +223,7 @@ type FileNoIoctl struct{}
|
||||
|
||||
// Ioctl implements fs.FileOperations.Ioctl.
|
||||
func (FileNoIoctl) Ioctl(context.Context, *fs.File, usermem.IO, arch.SyscallArguments) (uintptr, error) {
|
||||
return 0, syserror.ENOTTY
|
||||
return 0, linuxerr.ENOTTY
|
||||
}
|
||||
|
||||
// FileNoSplice implements fs.FileOperations.ReadFrom and
|
||||
|
||||
@@ -237,7 +237,7 @@ func (i *InodeSimpleExtendedAttributes) SetXattr(_ context.Context, _ *fs.Inode,
|
||||
|
||||
_, ok := i.xattrs[name]
|
||||
if ok && flags&linux.XATTR_CREATE != 0 {
|
||||
return syserror.EEXIST
|
||||
return linuxerr.EEXIST
|
||||
}
|
||||
if !ok && flags&linux.XATTR_REPLACE != 0 {
|
||||
return linuxerr.ENODATA
|
||||
@@ -332,47 +332,47 @@ type InodeNotDirectory struct{}
|
||||
|
||||
// Lookup implements fs.InodeOperations.Lookup.
|
||||
func (InodeNotDirectory) Lookup(context.Context, *fs.Inode, string) (*fs.Dirent, error) {
|
||||
return nil, syserror.ENOTDIR
|
||||
return nil, linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// Create implements fs.InodeOperations.Create.
|
||||
func (InodeNotDirectory) Create(context.Context, *fs.Inode, string, fs.FileFlags, fs.FilePermissions) (*fs.File, error) {
|
||||
return nil, syserror.ENOTDIR
|
||||
return nil, linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// CreateLink implements fs.InodeOperations.CreateLink.
|
||||
func (InodeNotDirectory) CreateLink(context.Context, *fs.Inode, string, string) error {
|
||||
return syserror.ENOTDIR
|
||||
return linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// CreateHardLink implements fs.InodeOperations.CreateHardLink.
|
||||
func (InodeNotDirectory) CreateHardLink(context.Context, *fs.Inode, *fs.Inode, string) error {
|
||||
return syserror.ENOTDIR
|
||||
return linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// CreateDirectory implements fs.InodeOperations.CreateDirectory.
|
||||
func (InodeNotDirectory) CreateDirectory(context.Context, *fs.Inode, string, fs.FilePermissions) error {
|
||||
return syserror.ENOTDIR
|
||||
return linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// Bind implements fs.InodeOperations.Bind.
|
||||
func (InodeNotDirectory) Bind(context.Context, *fs.Inode, string, transport.BoundEndpoint, fs.FilePermissions) (*fs.Dirent, error) {
|
||||
return nil, syserror.ENOTDIR
|
||||
return nil, linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// CreateFifo implements fs.InodeOperations.CreateFifo.
|
||||
func (InodeNotDirectory) CreateFifo(context.Context, *fs.Inode, string, fs.FilePermissions) error {
|
||||
return syserror.ENOTDIR
|
||||
return linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// Remove implements fs.InodeOperations.Remove.
|
||||
func (InodeNotDirectory) Remove(context.Context, *fs.Inode, string) error {
|
||||
return syserror.ENOTDIR
|
||||
return linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// RemoveDirectory implements fs.InodeOperations.RemoveDirectory.
|
||||
func (InodeNotDirectory) RemoveDirectory(context.Context, *fs.Inode, string) error {
|
||||
return syserror.ENOTDIR
|
||||
return linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// Rename implements fs.FileOperations.Rename.
|
||||
@@ -463,22 +463,22 @@ type InodeNoExtendedAttributes struct{}
|
||||
|
||||
// GetXattr implements fs.InodeOperations.GetXattr.
|
||||
func (InodeNoExtendedAttributes) GetXattr(context.Context, *fs.Inode, string, uint64) (string, error) {
|
||||
return "", syserror.EOPNOTSUPP
|
||||
return "", linuxerr.EOPNOTSUPP
|
||||
}
|
||||
|
||||
// SetXattr implements fs.InodeOperations.SetXattr.
|
||||
func (InodeNoExtendedAttributes) SetXattr(context.Context, *fs.Inode, string, string, uint32) error {
|
||||
return syserror.EOPNOTSUPP
|
||||
return linuxerr.EOPNOTSUPP
|
||||
}
|
||||
|
||||
// ListXattr implements fs.InodeOperations.ListXattr.
|
||||
func (InodeNoExtendedAttributes) ListXattr(context.Context, *fs.Inode, uint64) (map[string]struct{}, error) {
|
||||
return nil, syserror.EOPNOTSUPP
|
||||
return nil, linuxerr.EOPNOTSUPP
|
||||
}
|
||||
|
||||
// RemoveXattr implements fs.InodeOperations.RemoveXattr.
|
||||
func (InodeNoExtendedAttributes) RemoveXattr(context.Context, *fs.Inode, string) error {
|
||||
return syserror.EOPNOTSUPP
|
||||
return linuxerr.EOPNOTSUPP
|
||||
}
|
||||
|
||||
// InodeNoopRelease implements fs.InodeOperations.Release as a noop.
|
||||
@@ -513,7 +513,7 @@ type InodeNotAllocatable struct{}
|
||||
|
||||
// Allocate implements fs.InodeOperations.Allocate.
|
||||
func (InodeNotAllocatable) Allocate(_ context.Context, _ *fs.Inode, _, _ int64) error {
|
||||
return syserror.EOPNOTSUPP
|
||||
return linuxerr.EOPNOTSUPP
|
||||
}
|
||||
|
||||
// InodeNoopAllocate implements fs.InodeOperations.Allocate as a noop.
|
||||
|
||||
@@ -20,13 +20,13 @@ import (
|
||||
"testing"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/errors/linuxerr"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/safemem"
|
||||
"gvisor.dev/gvisor/pkg/sentry/contexttest"
|
||||
"gvisor.dev/gvisor/pkg/sentry/fs"
|
||||
ktime "gvisor.dev/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.dev/gvisor/pkg/sentry/memmap"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
)
|
||||
|
||||
@@ -244,7 +244,7 @@ func (*sliceBackingFile) FD() int {
|
||||
}
|
||||
|
||||
func (f *sliceBackingFile) Allocate(ctx context.Context, offset int64, length int64) error {
|
||||
return syserror.EOPNOTSUPP
|
||||
return linuxerr.EOPNOTSUPP
|
||||
}
|
||||
|
||||
type noopMappingSpace struct{}
|
||||
|
||||
@@ -277,7 +277,7 @@ func (i *inodeOperations) Bind(ctx context.Context, dir *fs.Inode, name string,
|
||||
|
||||
s := i.session()
|
||||
if s.overrides == nil {
|
||||
return nil, syserror.EOPNOTSUPP
|
||||
return nil, linuxerr.EOPNOTSUPP
|
||||
}
|
||||
|
||||
// Stabilize the override map while creation is in progress.
|
||||
|
||||
@@ -266,7 +266,7 @@ func (i *inodeOperations) Rename(ctx context.Context, inode *fs.Inode, oldParent
|
||||
|
||||
// Bind implements fs.InodeOperations.Bind.
|
||||
func (i *inodeOperations) Bind(ctx context.Context, dir *fs.Inode, name string, data transport.BoundEndpoint, perm fs.FilePermissions) (*fs.Dirent, error) {
|
||||
return nil, syserror.EOPNOTSUPP
|
||||
return nil, linuxerr.EOPNOTSUPP
|
||||
}
|
||||
|
||||
// BoundEndpoint implements fs.InodeOperations.BoundEndpoint.
|
||||
|
||||
@@ -127,7 +127,7 @@ func (t *TTYFileOperations) Release(ctx context.Context) {
|
||||
func (t *TTYFileOperations) Ioctl(ctx context.Context, _ *fs.File, io usermem.IO, args arch.SyscallArguments) (uintptr, error) {
|
||||
task := kernel.TaskFromContext(ctx)
|
||||
if task == nil {
|
||||
return 0, syserror.ENOTTY
|
||||
return 0, linuxerr.ENOTTY
|
||||
}
|
||||
|
||||
// Ignore arg[0]. This is the real FD:
|
||||
@@ -168,7 +168,7 @@ func (t *TTYFileOperations) Ioctl(ctx context.Context, _ *fs.File, io usermem.IO
|
||||
|
||||
pidns := kernel.PIDNamespaceFromContext(ctx)
|
||||
if pidns == nil {
|
||||
return 0, syserror.ENOTTY
|
||||
return 0, linuxerr.ENOTTY
|
||||
}
|
||||
|
||||
t.mu.Lock()
|
||||
@@ -193,7 +193,7 @@ func (t *TTYFileOperations) Ioctl(ctx context.Context, _ *fs.File, io usermem.IO
|
||||
// drivers/tty/tty_io.c:tiocspgrp() converts -EIO from
|
||||
// tty_check_change() to -ENOTTY.
|
||||
if linuxerr.Equals(linuxerr.EIO, err) {
|
||||
return 0, syserror.ENOTTY
|
||||
return 0, linuxerr.ENOTTY
|
||||
}
|
||||
return 0, err
|
||||
}
|
||||
@@ -201,7 +201,7 @@ func (t *TTYFileOperations) Ioctl(ctx context.Context, _ *fs.File, io usermem.IO
|
||||
// Check that calling task's process group is in the TTY
|
||||
// session.
|
||||
if task.ThreadGroup().Session() != t.session {
|
||||
return 0, syserror.ENOTTY
|
||||
return 0, linuxerr.ENOTTY
|
||||
}
|
||||
|
||||
var pgIDP primitive.Int32
|
||||
@@ -219,7 +219,7 @@ func (t *TTYFileOperations) Ioctl(ctx context.Context, _ *fs.File, io usermem.IO
|
||||
pidns := task.PIDNamespace()
|
||||
pg := pidns.ProcessGroupWithID(pgID)
|
||||
if pg == nil {
|
||||
return 0, syserror.ESRCH
|
||||
return 0, linuxerr.ESRCH
|
||||
}
|
||||
|
||||
// Check that new process group is in the TTY session.
|
||||
@@ -284,7 +284,7 @@ func (t *TTYFileOperations) Ioctl(ctx context.Context, _ *fs.File, io usermem.IO
|
||||
unimpl.EmitUnimplementedEvent(ctx)
|
||||
fallthrough
|
||||
default:
|
||||
return 0, syserror.ENOTTY
|
||||
return 0, linuxerr.ENOTTY
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -122,7 +122,7 @@ func (*Inotify) Seek(context.Context, *File, SeekWhence, int64) (int64, error) {
|
||||
|
||||
// Readdir implements FileOperatons.Readdir.
|
||||
func (*Inotify) Readdir(context.Context, *File, DentrySerializer) (int64, error) {
|
||||
return 0, syserror.ENOTDIR
|
||||
return 0, linuxerr.ENOTDIR
|
||||
}
|
||||
|
||||
// Write implements FileOperations.Write.
|
||||
@@ -223,7 +223,7 @@ func (i *Inotify) Ioctl(ctx context.Context, _ *File, io usermem.IO, args arch.S
|
||||
return 0, err
|
||||
|
||||
default:
|
||||
return 0, syserror.ENOTTY
|
||||
return 0, linuxerr.ENOTTY
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/refs"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/auth"
|
||||
"gvisor.dev/gvisor/pkg/sync"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
)
|
||||
|
||||
// DefaultTraversalLimit provides a sensible default traversal limit that may
|
||||
@@ -498,7 +497,7 @@ func (mns *MountNamespace) FindLink(ctx context.Context, root, wd *Dirent, path
|
||||
if current != root {
|
||||
if !IsDir(current.Inode.StableAttr) {
|
||||
current.DecRef(ctx) // Drop reference from above.
|
||||
return nil, syserror.ENOTDIR
|
||||
return nil, linuxerr.ENOTDIR
|
||||
}
|
||||
if err := current.Inode.CheckPermission(ctx, PermMask{Execute: true}); err != nil {
|
||||
current.DecRef(ctx) // Drop reference from above.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user