mirror of https://github.com/pkg/sftp.git
				
				
				
			address review set 2
This commit is contained in:
		
							parent
							
								
									96b29c55dd
								
							
						
					
					
						commit
						8411183d33
					
				|  | @ -7,7 +7,6 @@ import ( | |||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	iofs "io/fs" | ||||
| 	"math" | ||||
| 	"os" | ||||
| 	"path" | ||||
|  | @ -2143,7 +2142,7 @@ func toPflags(f int) uint32 { | |||
| // setuid, setgid and sticky in m, because we've historically supported those
 | ||||
| // bits, and we mask off any non-permission bits.
 | ||||
| func toChmodPerm(m os.FileMode) (perm uint32) { | ||||
| 	const mask = os.ModePerm | iofs.FileMode(s_ISUID|s_ISGID|s_ISVTX) | ||||
| 	const mask = os.ModePerm | os.FileMode(s_ISUID|s_ISGID|s_ISVTX) | ||||
| 	perm = uint32(m & mask) | ||||
| 
 | ||||
| 	if m&os.ModeSetuid != 0 { | ||||
|  |  | |||
|  | @ -9,7 +9,6 @@ import ( | |||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	iofs "io/fs" | ||||
| 	"io/ioutil" | ||||
| 	"math/rand" | ||||
| 	"net" | ||||
|  | @ -975,7 +974,7 @@ func TestClientSetuid(t *testing.T) { | |||
| 	f.Close() | ||||
| 
 | ||||
| 	const allPerm = os.ModePerm | os.ModeSetuid | os.ModeSetgid | os.ModeSticky | | ||||
| 		iofs.FileMode(s_ISUID|s_ISGID|s_ISVTX) | ||||
| 		os.FileMode(s_ISUID|s_ISGID|s_ISVTX) | ||||
| 
 | ||||
| 	for _, c := range []struct { | ||||
| 		goPerm    os.FileMode | ||||
|  |  | |||
|  | @ -0,0 +1,42 @@ | |||
| package sftp | ||||
| 
 | ||||
| import ( | ||||
| 	"os" | ||||
| 	"syscall" | ||||
| ) | ||||
| 
 | ||||
| var EBADF = syscall.NewError("fd out of range or not open") | ||||
| 
 | ||||
| func wrapPathError(filepath string, err error) error { | ||||
| 	if errno, ok := err.(syscall.ErrorString); ok { | ||||
| 		return &os.PathError{Path: filepath, Err: errno} | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // translateErrno translates a syscall error number to a SFTP error code.
 | ||||
| func translateErrno(errno syscall.ErrorString) uint32 { | ||||
| 	switch errno { | ||||
| 	case "": | ||||
| 		return sshFxOk | ||||
| 	case syscall.ENOENT: | ||||
| 		return sshFxNoSuchFile | ||||
| 	case syscall.EPERM: | ||||
| 		return sshFxPermissionDenied | ||||
| 	} | ||||
| 
 | ||||
| 	return sshFxFailure | ||||
| } | ||||
| 
 | ||||
| func translateSyscallError(err error) (uint32, bool) { | ||||
| 	switch e := err.(type) { | ||||
| 	case syscall.ErrorString: | ||||
| 		return translateErrno(e), true | ||||
| 	case *os.PathError: | ||||
| 		debug("statusFromError,pathError: error is %T %#v", e.Err, e.Err) | ||||
| 		if errno, ok := e.Err.(syscall.ErrorString); ok { | ||||
| 			return translateErrno(errno), true | ||||
| 		} | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
|  | @ -0,0 +1,45 @@ | |||
| //go:build !plan9
 | ||||
| // +build !plan9
 | ||||
| 
 | ||||
| package sftp | ||||
| 
 | ||||
| import ( | ||||
| 	"os" | ||||
| 	"syscall" | ||||
| ) | ||||
| 
 | ||||
| const EBADF = syscall.EBADF | ||||
| 
 | ||||
| func wrapPathError(filepath string, err error) error { | ||||
| 	if errno, ok := err.(syscall.Errno); ok { | ||||
| 		return &os.PathError{Path: filepath, Err: errno} | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // translateErrno translates a syscall error number to a SFTP error code.
 | ||||
| func translateErrno(errno syscall.Errno) uint32 { | ||||
| 	switch errno { | ||||
| 	case 0: | ||||
| 		return sshFxOk | ||||
| 	case syscall.ENOENT: | ||||
| 		return sshFxNoSuchFile | ||||
| 	case syscall.EACCES, syscall.EPERM: | ||||
| 		return sshFxPermissionDenied | ||||
| 	} | ||||
| 
 | ||||
| 	return sshFxFailure | ||||
| } | ||||
| 
 | ||||
| func translateSyscallError(err error) (uint32, bool) { | ||||
| 	switch e := err.(type) { | ||||
| 	case syscall.Errno: | ||||
| 		return translateErrno(e), true | ||||
| 	case *os.PathError: | ||||
| 		debug("statusFromError,pathError: error is %T %#v", e.Err, e.Err) | ||||
| 		if errno, ok := e.Err.(syscall.Errno); ok { | ||||
| 			return translateErrno(errno), true | ||||
| 		} | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
|  | @ -1,51 +1,11 @@ | |||
| //go:build !plan9
 | ||||
| // +build !plan9
 | ||||
| 
 | ||||
| package sftp | ||||
| 
 | ||||
| import ( | ||||
| 	"os" | ||||
| 	"syscall" | ||||
| 
 | ||||
| 	sshfx "github.com/pkg/sftp/internal/encoding/ssh/filexfer" | ||||
| ) | ||||
| 
 | ||||
| const EBADF = syscall.EBADF | ||||
| 
 | ||||
| func wrapPathError(filepath string, err error) error { | ||||
| 	if errno, ok := err.(syscall.Errno); ok { | ||||
| 		return &os.PathError{Path: filepath, Err: errno} | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // translateErrno translates a syscall error number to a SFTP error code.
 | ||||
| func translateErrno(errno syscall.Errno) uint32 { | ||||
| 	switch errno { | ||||
| 	case 0: | ||||
| 		return sshFxOk | ||||
| 	case syscall.ENOENT: | ||||
| 		return sshFxNoSuchFile | ||||
| 	case syscall.EACCES, syscall.EPERM: | ||||
| 		return sshFxPermissionDenied | ||||
| 	} | ||||
| 
 | ||||
| 	return sshFxFailure | ||||
| } | ||||
| 
 | ||||
| func translateSyscallError(err error) (uint32, bool) { | ||||
| 	switch e := err.(type) { | ||||
| 	case syscall.Errno: | ||||
| 		return translateErrno(e), true | ||||
| 	case *os.PathError: | ||||
| 		debug("statusFromError,pathError: error is %T %#v", e.Err, e.Err) | ||||
| 		if errno, ok := e.Err.(syscall.Errno); ok { | ||||
| 			return translateErrno(errno), true | ||||
| 		} | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
| 
 | ||||
| // isRegular returns true if the mode describes a regular file.
 | ||||
| func isRegular(mode uint32) bool { | ||||
| 	return sshfx.FileMode(mode)&sshfx.ModeType == sshfx.ModeRegular | ||||
|  | @ -124,3 +84,10 @@ const ( | |||
| 	s_ISGID = uint32(sshfx.ModeSetGID) | ||||
| 	s_ISVTX = uint32(sshfx.ModeSticky) | ||||
| ) | ||||
| 
 | ||||
| // Legacy export:
 | ||||
| //
 | ||||
| // Go defines S_IFMT on windows, plan9 and js/wasm as 0x1f000 instead of
 | ||||
| // 0xf000. None of the the other S_IFxyz values include the "1" (in 0x1f000)
 | ||||
| // which prevents them from matching the bitmask.
 | ||||
| const S_IFMT = uint32(sshfx.ModeType) | ||||
							
								
								
									
										103
									
								
								stat_plan9.go
								
								
								
								
							
							
						
						
									
										103
									
								
								stat_plan9.go
								
								
								
								
							|  | @ -1,103 +0,0 @@ | |||
| package sftp | ||||
| 
 | ||||
| import ( | ||||
| 	"os" | ||||
| 	"syscall" | ||||
| ) | ||||
| 
 | ||||
| var EBADF = syscall.NewError("fd out of range or not open") | ||||
| 
 | ||||
| func wrapPathError(filepath string, err error) error { | ||||
| 	if errno, ok := err.(syscall.ErrorString); ok { | ||||
| 		return &os.PathError{Path: filepath, Err: errno} | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // translateErrno translates a syscall error number to a SFTP error code.
 | ||||
| func translateErrno(errno syscall.ErrorString) uint32 { | ||||
| 	switch errno { | ||||
| 	case "": | ||||
| 		return sshFxOk | ||||
| 	case syscall.ENOENT: | ||||
| 		return sshFxNoSuchFile | ||||
| 	case syscall.EPERM: | ||||
| 		return sshFxPermissionDenied | ||||
| 	} | ||||
| 
 | ||||
| 	return sshFxFailure | ||||
| } | ||||
| 
 | ||||
| func translateSyscallError(err error) (uint32, bool) { | ||||
| 	switch e := err.(type) { | ||||
| 	case syscall.ErrorString: | ||||
| 		return translateErrno(e), true | ||||
| 	case *os.PathError: | ||||
| 		debug("statusFromError,pathError: error is %T %#v", e.Err, e.Err) | ||||
| 		if errno, ok := e.Err.(syscall.ErrorString); ok { | ||||
| 			return translateErrno(errno), true | ||||
| 		} | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
| 
 | ||||
| // isRegular returns true if the mode describes a regular file.
 | ||||
| func isRegular(mode uint32) bool { | ||||
| 	return mode&S_IFMT == syscall.S_IFREG | ||||
| } | ||||
| 
 | ||||
| // toFileMode converts sftp filemode bits to the os.FileMode specification
 | ||||
| func toFileMode(mode uint32) os.FileMode { | ||||
| 	var fm = os.FileMode(mode & 0777) | ||||
| 
 | ||||
| 	switch mode & S_IFMT { | ||||
| 	case syscall.S_IFBLK: | ||||
| 		fm |= os.ModeDevice | ||||
| 	case syscall.S_IFCHR: | ||||
| 		fm |= os.ModeDevice | os.ModeCharDevice | ||||
| 	case syscall.S_IFDIR: | ||||
| 		fm |= os.ModeDir | ||||
| 	case syscall.S_IFIFO: | ||||
| 		fm |= os.ModeNamedPipe | ||||
| 	case syscall.S_IFLNK: | ||||
| 		fm |= os.ModeSymlink | ||||
| 	case syscall.S_IFREG: | ||||
| 		// nothing to do
 | ||||
| 	case syscall.S_IFSOCK: | ||||
| 		fm |= os.ModeSocket | ||||
| 	} | ||||
| 
 | ||||
| 	return fm | ||||
| } | ||||
| 
 | ||||
| // fromFileMode converts from the os.FileMode specification to sftp filemode bits
 | ||||
| func fromFileMode(mode os.FileMode) uint32 { | ||||
| 	ret := uint32(mode & os.ModePerm) | ||||
| 
 | ||||
| 	switch mode & os.ModeType { | ||||
| 	case os.ModeDevice | os.ModeCharDevice: | ||||
| 		ret |= syscall.S_IFCHR | ||||
| 	case os.ModeDevice: | ||||
| 		ret |= syscall.S_IFBLK | ||||
| 	case os.ModeDir: | ||||
| 		ret |= syscall.S_IFDIR | ||||
| 	case os.ModeNamedPipe: | ||||
| 		ret |= syscall.S_IFIFO | ||||
| 	case os.ModeSymlink: | ||||
| 		ret |= syscall.S_IFLNK | ||||
| 	case 0: | ||||
| 		ret |= syscall.S_IFREG | ||||
| 	case os.ModeSocket: | ||||
| 		ret |= syscall.S_IFSOCK | ||||
| 	} | ||||
| 
 | ||||
| 	return ret | ||||
| } | ||||
| 
 | ||||
| // Plan 9 doesn't have setuid, setgid or sticky, but a Plan 9 client should
 | ||||
| // be able to send these bits to a POSIX server.
 | ||||
| const ( | ||||
| 	s_ISUID = 04000 | ||||
| 	s_ISGID = 02000 | ||||
| 	s_ISVTX = 01000 | ||||
| ) | ||||
|  | @ -1,9 +0,0 @@ | |||
| // Go defines S_IFMT on windows, plan9 and js/wasm as 0x1f000 instead of
 | ||||
| // 0xf000. None of the the other S_IFxyz values include the "1" (in 0x1f000)
 | ||||
| // which prevents them from matching the bitmask.
 | ||||
| 
 | ||||
| package sftp | ||||
| 
 | ||||
| import sshfx "github.com/pkg/sftp/internal/encoding/ssh/filexfer" | ||||
| 
 | ||||
| const S_IFMT = uint32(sshfx.ModeType) | ||||
		Loading…
	
		Reference in New Issue