Merge branch 'pr/909'

* pr/909:
  Add Vilbrekin
  Correctly check whether parent directory is writable for current user. "&04" was checking if file is readable by others, while "&0200" checks if it's writable for current user.
This commit is contained in:
Jakob Borg
2014-10-26 13:59:09 +01:00
7 changed files with 34 additions and 6 deletions

View File

@@ -20,6 +20,7 @@ import (
"path/filepath"
"sync"
"github.com/syncthing/syncthing/internal/osutil"
"github.com/syncthing/syncthing/internal/protocol"
)
@@ -68,7 +69,7 @@ func (s *sharedPullerState) tempFile() (*os.File, error) {
if info, err := os.Stat(dir); err != nil {
s.earlyCloseLocked("dst stat dir", err)
return nil, err
} else if info.Mode()&04 == 0 {
} else if info.Mode()&0200 == 0 {
err := os.Chmod(dir, 0755)
if err == nil {
defer func() {
@@ -136,7 +137,8 @@ func (s *sharedPullerState) earlyCloseLocked(context string, err error) {
s.err = err
if s.fd != nil {
s.fd.Close()
os.Remove(s.tempName)
// Delete temporary file, even if parent dir is read-only
osutil.InWritableDir(func(string) error { os.Remove(s.tempName); return nil }, s.tempName)
}
s.closed = true
}

View File

@@ -15,7 +15,11 @@
package model
import "testing"
import (
"os"
"path/filepath"
"testing"
)
func TestSourceFileOK(t *testing.T) {
s := sharedPullerState{
@@ -61,3 +65,23 @@ func TestSourceFileBad(t *testing.T) {
t.Fatal("Unexpected nil failed()")
}
}
// Test creating temporary file inside read-only directory
func TestReadOnlyDir(t *testing.T) {
s := sharedPullerState{
tempName: "testdata/read_only_dir/.temp_name",
}
// Ensure dir is read-only (git doesn't store full permissions)
os.Chmod(filepath.Dir(s.tempName), 0555)
fd, err := s.tempFile()
if err != nil {
t.Fatal(err)
}
if fd == nil {
t.Fatal("Unexpected nil fd")
}
s.earlyClose("Test done", nil)
}

View File