diff --git a/conversions.go b/conversions.go index c330f8a..ddb57d5 100644 --- a/conversions.go +++ b/conversions.go @@ -294,8 +294,16 @@ func convertInMessage( } case fusekernel.OpOpen: + type input fusekernel.OpenIn + in := (*input)(inMsg.Consume(unsafe.Sizeof(input{}))) + if in == nil { + return nil, errors.New("Corrupt OpOpen") + } + openFlags := fusekernel.OpenFlags(in.Flags) + o = &fuseops.OpenFileOp{ Inode: fuseops.InodeID(inMsg.Header().Nodeid), + OpenFlags: &openFlags, OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, } diff --git a/fuseops/ops.go b/fuseops/ops.go index 06537d9..0f51b25 100644 --- a/fuseops/ops.go +++ b/fuseops/ops.go @@ -17,6 +17,8 @@ package fuseops import ( "os" "time" + + "github.com/jacobsa/fuse/internal/fusekernel" ) //////////////////////////////////////////////////////////////////////// @@ -646,6 +648,8 @@ type OpenFileOp struct { // advance, for example, because contents are generated on the fly. UseDirectIO bool + OpenFlags *fusekernel.OpenFlags + OpContext OpContext } diff --git a/samples/memfs/memfs.go b/samples/memfs/memfs.go index a09e79f..3fb0206 100644 --- a/samples/memfs/memfs.go +++ b/samples/memfs/memfs.go @@ -661,6 +661,9 @@ func (fs *memFS) OpenFile( // OpenFileOp should have a valid pid in context. return fuse.EINVAL } + if op.OpenFlags == nil { + return fuse.EINVAL + } fs.mu.Lock() defer fs.mu.Unlock()