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.
This commit is contained in:
Jakob Unterwurzacher 2016-05-29 22:41:46 +02:00
parent 77813bdc13
commit fd53dfd2ad
2 changed files with 19 additions and 13 deletions

View File

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

View File

@ -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) {