aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Unterwurzacher2016-05-29 22:41:46 +0200
committerJakob Unterwurzacher2016-05-29 22:43:48 +0200
commitfd53dfd2ad88d9d277e5ab93fba1b81a5f2255d4 (patch)
tree488d411a2dde99390a2500cd505c87617e01335f
parent77813bdc13118fd08bbff7a68c9d5268080a2a15 (diff)
fusefronted: check Fstat return value on file create
The Fstat call should never fail, but still, if it does return an error it should be handled properly.
-rw-r--r--internal/fusefrontend/file.go10
-rw-r--r--internal/fusefrontend/fs.go22
2 files changed, 19 insertions, 13 deletions
diff --git a/internal/fusefrontend/file.go b/internal/fusefrontend/file.go
index ce806b6..33afcb9 100644
--- a/internal/fusefrontend/file.go
+++ b/internal/fusefrontend/file.go
@@ -41,9 +41,13 @@ type file struct {
header *contentenc.FileHeader
}
-func NewFile(fd *os.File, writeOnly bool, contentEnc *contentenc.ContentEnc) nodefs.File {
+func NewFile(fd *os.File, writeOnly bool, contentEnc *contentenc.ContentEnc) (nodefs.File, fuse.Status) {
var st syscall.Stat_t
- syscall.Fstat(int(fd.Fd()), &st)
+ err := syscall.Fstat(int(fd.Fd()), &st)
+ if err != nil {
+ toggledlog.Warn.Printf("NewFile: Fstat on fd %d failed: %v\n", fd.Fd(), err)
+ return nil, fuse.ToStatus(err)
+ }
wlock.register(st.Ino)
return &file{
@@ -51,7 +55,7 @@ func NewFile(fd *os.File, writeOnly bool, contentEnc *contentenc.ContentEnc) nod
writeOnly: writeOnly,
contentEnc: contentEnc,
ino: st.Ino,
- }
+ }, fuse.OK
}
// intFd - return the backing file descriptor as an integer. Used for debug
diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go
index b7528a1..1ef88b7 100644
--- a/internal/fusefrontend/fs.go
+++ b/internal/fusefrontend/fs.go
@@ -100,7 +100,7 @@ func (fs *FS) Open(path string, flags uint32, context *fuse.Context) (fuseFile n
return nil, fuse.ToStatus(err)
}
- return NewFile(f, writeOnly, fs.contentEnc), fuse.OK
+ return NewFile(f, writeOnly, fs.contentEnc)
}
func (fs *FS) Create(path string, flags uint32, mode uint32, context *fuse.Context) (fuseFile nodefs.File, code fuse.Status) {
@@ -113,8 +113,10 @@ func (fs *FS) Create(path string, flags uint32, mode uint32, context *fuse.Conte
return nil, fuse.ToStatus(err)
}
- // Handle long file name
+ var fd *os.File
cName := filepath.Base(cPath)
+
+ // Handle long file name
if nametransform.IsLongContent(cName) {
var dirfd *os.File
dirfd, err = os.Open(filepath.Dir(cPath))
@@ -136,16 +138,16 @@ func (fs *FS) Create(path string, flags uint32, mode uint32, context *fuse.Conte
nametransform.DeleteLongName(dirfd, cName)
return nil, fuse.ToStatus(err)
}
- fd := os.NewFile(uintptr(fdRaw), cName)
-
- return NewFile(fd, writeOnly, fs.contentEnc), fuse.OK
+ fd = os.NewFile(uintptr(fdRaw), cName)
+ } else {
+ // Normal (short) file name
+ fd, err = os.OpenFile(cPath, iflags|os.O_CREATE, os.FileMode(mode))
+ if err != nil {
+ return nil, fuse.ToStatus(err)
+ }
}
- fd, err := os.OpenFile(cPath, iflags|os.O_CREATE, os.FileMode(mode))
- if err != nil {
- return nil, fuse.ToStatus(err)
- }
- return NewFile(fd, writeOnly, fs.contentEnc), fuse.OK
+ return NewFile(fd, writeOnly, fs.contentEnc)
}
func (fs *FS) Chmod(path string, mode uint32, context *fuse.Context) (code fuse.Status) {