From ce4b897d0e079cc2afd407def1954385a81b8736 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 30 Dec 2014 14:37:06 +0100 Subject: [PATCH] Handle read only temp files after crash/restart --- internal/model/sharedpullerstate.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/internal/model/sharedpullerstate.go b/internal/model/sharedpullerstate.go index 29fe68b6..015b05de 100644 --- a/internal/model/sharedpullerstate.go +++ b/internal/model/sharedpullerstate.go @@ -110,6 +110,17 @@ func (s *sharedPullerState) tempFile() (io.WriterAt, error) { flags := os.O_WRONLY if s.reused == 0 { flags |= os.O_CREATE | os.O_EXCL + } else { + // With sufficiently bad luck when exiting or crashing, we may have + // had time to chmod the temp file to read only state but not yet + // moved it to it's final name. This leaves us with a read only temp + // file that we're going to try to reuse. To handle that, we need to + // make sure we have write permissions on the file before opening it. + err := os.Chmod(s.tempName, 0644) + if err != nil { + s.earlyCloseLocked("dst create chmod", err) + return nil, err + } } fd, err := os.OpenFile(s.tempName, flags, 0644) if err != nil {