Skip to content

Commit

Permalink
address review set 1
Browse files Browse the repository at this point in the history
  • Loading branch information
dustin-ward committed Apr 5, 2024
1 parent 9b553cc commit 96b29c5
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 183 deletions.
3 changes: 2 additions & 1 deletion client.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"errors"
"fmt"
"io"
iofs "io/fs"
"math"
"os"
"path"
Expand Down Expand Up @@ -2142,7 +2143,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 | s_ISUID | s_ISGID | s_ISVTX
const mask = os.ModePerm | iofs.FileMode(s_ISUID|s_ISGID|s_ISVTX)
perm = uint32(m & mask)

if m&os.ModeSetuid != 0 {
Expand Down
3 changes: 2 additions & 1 deletion client_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"errors"
"fmt"
"io"
iofs "io/fs"
"io/ioutil"
"math/rand"
"net"
Expand Down Expand Up @@ -974,7 +975,7 @@ func TestClientSetuid(t *testing.T) {
f.Close()

const allPerm = os.ModePerm | os.ModeSetuid | os.ModeSetgid | os.ModeSticky |
s_ISUID | s_ISGID | s_ISVTX
iofs.FileMode(s_ISUID|s_ISGID|s_ISVTX)

for _, c := range []struct {
goPerm os.FileMode
Expand Down
59 changes: 30 additions & 29 deletions stat_posix.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
//go:build !plan9 && !zos
//go:build !plan9
// +build !plan9
// +build !zos

package sftp

import (
"os"
"syscall"

sshfx "github.com/pkg/sftp/internal/encoding/ssh/filexfer"
)

const EBADF = syscall.EBADF
Expand Down Expand Up @@ -47,37 +48,37 @@ func translateSyscallError(err error) (uint32, bool) {

// isRegular returns true if the mode describes a regular file.
func isRegular(mode uint32) bool {
return mode&S_IFMT == syscall.S_IFREG
return sshfx.FileMode(mode)&sshfx.ModeType == sshfx.ModeRegular
}

// 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:
switch sshfx.FileMode(mode) & sshfx.ModeType {
case sshfx.ModeDevice:
fm |= os.ModeDevice
case syscall.S_IFCHR:
case sshfx.ModeCharDevice:
fm |= os.ModeDevice | os.ModeCharDevice
case syscall.S_IFDIR:
case sshfx.ModeDir:
fm |= os.ModeDir
case syscall.S_IFIFO:
case sshfx.ModeNamedPipe:
fm |= os.ModeNamedPipe
case syscall.S_IFLNK:
case sshfx.ModeSymlink:
fm |= os.ModeSymlink
case syscall.S_IFREG:
case sshfx.ModeRegular:
// nothing to do
case syscall.S_IFSOCK:
case sshfx.ModeSocket:
fm |= os.ModeSocket
}

if mode&syscall.S_ISUID != 0 {
if sshfx.FileMode(mode)&sshfx.ModeSetUID != 0 {
fm |= os.ModeSetuid
}
if mode&syscall.S_ISGID != 0 {
if sshfx.FileMode(mode)&sshfx.ModeSetGID != 0 {
fm |= os.ModeSetgid
}
if mode&syscall.S_ISVTX != 0 {
if sshfx.FileMode(mode)&sshfx.ModeSticky != 0 {
fm |= os.ModeSticky
}

Expand All @@ -86,40 +87,40 @@ func toFileMode(mode uint32) os.FileMode {

// fromFileMode converts from the os.FileMode specification to sftp filemode bits
func fromFileMode(mode os.FileMode) uint32 {
ret := uint32(mode & os.ModePerm)
ret := sshfx.FileMode(mode & os.ModePerm)

switch mode & os.ModeType {
case os.ModeDevice | os.ModeCharDevice:
ret |= syscall.S_IFCHR
ret |= sshfx.ModeCharDevice
case os.ModeDevice:
ret |= syscall.S_IFBLK
ret |= sshfx.ModeDevice
case os.ModeDir:
ret |= syscall.S_IFDIR
ret |= sshfx.ModeDir
case os.ModeNamedPipe:
ret |= syscall.S_IFIFO
ret |= sshfx.ModeNamedPipe
case os.ModeSymlink:
ret |= syscall.S_IFLNK
ret |= sshfx.ModeSymlink
case 0:
ret |= syscall.S_IFREG
ret |= sshfx.ModeRegular
case os.ModeSocket:
ret |= syscall.S_IFSOCK
ret |= sshfx.ModeSocket
}

if mode&os.ModeSetuid != 0 {
ret |= syscall.S_ISUID
ret |= sshfx.ModeSetUID
}
if mode&os.ModeSetgid != 0 {
ret |= syscall.S_ISGID
ret |= sshfx.ModeSetGID
}
if mode&os.ModeSticky != 0 {
ret |= syscall.S_ISVTX
ret |= sshfx.ModeSticky
}

return ret
return uint32(ret)
}

const (
s_ISUID = syscall.S_ISUID
s_ISGID = syscall.S_ISGID
s_ISVTX = syscall.S_ISVTX
s_ISUID = uint32(sshfx.ModeSetUID)
s_ISGID = uint32(sshfx.ModeSetGID)
s_ISVTX = uint32(sshfx.ModeSticky)
)
137 changes: 0 additions & 137 deletions stat_zos.go

This file was deleted.

7 changes: 3 additions & 4 deletions syscall_fixed.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
//go:build plan9 || windows || (js && wasm)
// +build plan9 windows js,wasm

// 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

const S_IFMT = 0xf000
import sshfx "github.com/pkg/sftp/internal/encoding/ssh/filexfer"

const S_IFMT = uint32(sshfx.ModeType)
11 changes: 0 additions & 11 deletions syscall_good.go

This file was deleted.

0 comments on commit 96b29c5

Please sign in to comment.