From bbf5b72fff8b07251faacce9e77dd427a4379081 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sun, 15 Jul 2018 12:00:08 +0200 Subject: [PATCH] WriteDirIV: delete incomplete gocryptfs.diriv file if write fails If the underlying filesystem is full, writing to gocryptfs.diriv may fail, and later fsck show this: OpenDir "xyz": could not read gocryptfs.diriv: wanted 16 bytes, got 0 Uncovered by xfstests generic/083. Also fixes a fd leak in the error path. --- internal/nametransform/diriv.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/nametransform/diriv.go b/internal/nametransform/diriv.go index 10f3226..d67a5fa 100644 --- a/internal/nametransform/diriv.go +++ b/internal/nametransform/diriv.go @@ -99,12 +99,17 @@ func WriteDirIV(dirfd *os.File, dir string) error { fd := os.NewFile(uintptr(fdRaw), file) _, err = fd.Write(iv) if err != nil { + fd.Close() tlog.Warn.Printf("WriteDirIV: Write: %v", err) + // Delete incomplete gocryptfs.diriv file + syscallcompat.Unlinkat(int(dirfd.Fd()), file, 0) return err } err = fd.Close() if err != nil { tlog.Warn.Printf("WriteDirIV: Close: %v", err) + // Delete incomplete gocryptfs.diriv file + syscallcompat.Unlinkat(int(dirfd.Fd()), file, 0) return err } return nil