fusefrontend: Utimens: ugly band-aid for nil pointer crash in go-fuse

Crash is described at https://github.com/rfjakob/gocryptfs/issues/48 .
Revert this once https://github.com/hanwen/go-fuse/pull/131 is merged.
This commit is contained in:
Jakob Unterwurzacher 2016-10-16 15:02:44 +02:00
parent a36e29f77e
commit 5144470e3d
2 changed files with 18 additions and 0 deletions

View File

@ -386,7 +386,19 @@ func (f *file) GetAttr(a *fuse.Attr) fuse.Status {
return fuse.OK return fuse.OK
} }
// TODO drop this once https://github.com/hanwen/go-fuse/pull/131 is
// merged
const BrokenAtimeOmit = true
func (f *file) Utimens(a *time.Time, m *time.Time) fuse.Status { func (f *file) Utimens(a *time.Time, m *time.Time) fuse.Status {
if a == nil && BrokenAtimeOmit {
// Band-aid for a nil pointer crash, described in
// https://github.com/rfjakob/gocryptfs/issues/48
//
// TODO drop this once https://github.com/hanwen/go-fuse/pull/131 is
// merged
a = m
}
f.fdLock.RLock() f.fdLock.RLock()
defer f.fdLock.RUnlock() defer f.fdLock.RUnlock()
return f.loopbackFile.Utimens(a, m) return f.loopbackFile.Utimens(a, m)

View File

@ -25,6 +25,7 @@ import (
"testing" "testing"
"github.com/rfjakob/gocryptfs/internal/cryptocore" "github.com/rfjakob/gocryptfs/internal/cryptocore"
"github.com/rfjakob/gocryptfs/internal/fusefrontend"
"github.com/rfjakob/gocryptfs/internal/syscallcompat" "github.com/rfjakob/gocryptfs/internal/syscallcompat"
"github.com/rfjakob/gocryptfs/tests/test_helpers" "github.com/rfjakob/gocryptfs/tests/test_helpers"
) )
@ -698,6 +699,11 @@ func doTestUtimesNano(t *testing.T, path string) {
out: [2]syscall.Timespec{{Sec: 1, Nsec: 2}, {Sec: 5, Nsec: 6}}, out: [2]syscall.Timespec{{Sec: 1, Nsec: 2}, {Sec: 5, Nsec: 6}},
}, },
} }
if fusefrontend.BrokenAtimeOmit {
// TODO remove this once the pull request is merged:
// https://github.com/hanwen/go-fuse/pull/131
utimeTestcases = utimeTestcases[:1]
}
for i, tc := range utimeTestcases { for i, tc := range utimeTestcases {
err := syscall.UtimesNano(path, tc.in[:]) err := syscall.UtimesNano(path, tc.in[:])
if err != nil { if err != nil {