diff options
| -rw-r--r-- | internal/fusefrontend/node.go | 10 | ||||
| -rw-r--r-- | internal/fusefrontend/node_helpers.go | 20 | ||||
| -rw-r--r-- | internal/syscallcompat/sys_linux.go | 29 | 
3 files changed, 26 insertions, 33 deletions
| diff --git a/internal/fusefrontend/node.go b/internal/fusefrontend/node.go index aa9bd51..5b42ddc 100644 --- a/internal/fusefrontend/node.go +++ b/internal/fusefrontend/node.go @@ -138,6 +138,7 @@ func (n *Node) Create(ctx context.Context, name string, flags uint32, mode uint3  	}  	newFlags := rn.mangleOpenFlags(flags)  	// Handle long file name +	ctx2 := toFuseCtx(ctx)  	if !rn.args.PlaintextNames && nametransform.IsLongContent(cName) {  		// Create ".name"  		err = rn.nameTransform.WriteLongNameAt(dirfd, cName, name) @@ -145,13 +146,13 @@ func (n *Node) Create(ctx context.Context, name string, flags uint32, mode uint3  			return nil, nil, 0, fs.ToErrno(err)  		}  		// Create content -		fd, err = syscallcompat.OpenatUserCtx(dirfd, cName, newFlags|syscall.O_CREAT|syscall.O_EXCL, mode, ctx) +		fd, err = syscallcompat.OpenatUser(dirfd, cName, newFlags|syscall.O_CREAT|syscall.O_EXCL, mode, ctx2)  		if err != nil {  			nametransform.DeleteLongNameAt(dirfd, cName)  		}  	} else {  		// Create content, normal (short) file name -		fd, err = syscallcompat.OpenatUserCtx(dirfd, cName, newFlags|syscall.O_CREAT|syscall.O_EXCL, mode, ctx) +		fd, err = syscallcompat.OpenatUser(dirfd, cName, newFlags|syscall.O_CREAT|syscall.O_EXCL, mode, ctx2)  	}  	if err != nil {  		// xfstests generic/488 triggers this @@ -322,6 +323,7 @@ func (n *Node) Mknod(ctx context.Context, name string, mode, rdev uint32, out *f  	// Create ".name" file to store long file name (except in PlaintextNames mode)  	var err error +	ctx2 := toFuseCtx(ctx)  	if !rn.args.PlaintextNames && nametransform.IsLongContent(cName) {  		err := rn.nameTransform.WriteLongNameAt(dirfd, cName, name)  		if err != nil { @@ -329,13 +331,13 @@ func (n *Node) Mknod(ctx context.Context, name string, mode, rdev uint32, out *f  			return  		}  		// Create "gocryptfs.longfile." device node -		err = syscallcompat.MknodatUserCtx(dirfd, cName, mode, int(rdev), ctx) +		err = syscallcompat.MknodatUser(dirfd, cName, mode, int(rdev), ctx2)  		if err != nil {  			nametransform.DeleteLongNameAt(dirfd, cName)  		}  	} else {  		// Create regular device node -		err = syscallcompat.MknodatUserCtx(dirfd, cName, mode, int(rdev), ctx) +		err = syscallcompat.MknodatUser(dirfd, cName, mode, int(rdev), ctx2)  	}  	if err != nil {  		errno = fs.ToErrno(err) diff --git a/internal/fusefrontend/node_helpers.go b/internal/fusefrontend/node_helpers.go new file mode 100644 index 0000000..1eb6d4a --- /dev/null +++ b/internal/fusefrontend/node_helpers.go @@ -0,0 +1,20 @@ +package fusefrontend + +import ( +	"context" + +	"github.com/hanwen/go-fuse/v2/fuse" +) + +// toFuseCtx tries to extract a fuse.Context from a generic context.Context. +func toFuseCtx(ctx context.Context) (ctx2 *fuse.Context) { +	if ctx == nil { +		return nil +	} +	if caller, ok := fuse.FromContext(ctx); ok { +		ctx2 = &fuse.Context{ +			Caller: *caller, +		} +	} +	return ctx2 +} diff --git a/internal/syscallcompat/sys_linux.go b/internal/syscallcompat/sys_linux.go index 5a23084..42e9da6 100644 --- a/internal/syscallcompat/sys_linux.go +++ b/internal/syscallcompat/sys_linux.go @@ -2,7 +2,6 @@  package syscallcompat  import ( -	"context"  	"fmt"  	"io/ioutil"  	"runtime" @@ -89,20 +88,6 @@ func getSupplementaryGroups(pid uint32) (gids []int) {  	return nil  } -// OpenatUserCtx is a tries to extract a fuse.Context from the generic ctx and -// calls OpenatUser. -func OpenatUserCtx(dirfd int, path string, flags int, mode uint32, ctx context.Context) (fd int, err error) { -	var ctx2 *fuse.Context -	if ctx != nil { -		if caller, ok := fuse.FromContext(ctx); ok { -			ctx2 = &fuse.Context{ -				Caller: *caller, -			} -		} -	} -	return OpenatUser(dirfd, path, flags, mode, ctx2) -} -  // OpenatUser runs the Openat syscall in the context of a different user.  func OpenatUser(dirfd int, path string, flags int, mode uint32, context *fuse.Context) (fd int, err error) {  	if context != nil { @@ -136,20 +121,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {  	return syscall.Mknodat(dirfd, path, mode, dev)  } -// MknodatUserCtx is a tries to extract a fuse.Context from the generic ctx and -// calls OpenatUser. -func MknodatUserCtx(dirfd int, path string, mode uint32, dev int, ctx context.Context) (err error) { -	var ctx2 *fuse.Context -	if ctx != nil { -		if caller, ok := fuse.FromContext(ctx); ok { -			ctx2 = &fuse.Context{ -				Caller: *caller, -			} -		} -	} -	return MknodatUser(dirfd, path, mode, dev, ctx2) -} -  // MknodatUser runs the Mknodat syscall in the context of a different user.  func MknodatUser(dirfd int, path string, mode uint32, dev int, context *fuse.Context) (err error) {  	if context != nil { | 
