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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
0
internal/model/testdata/read_only_dir/a
vendored
Normal file
0
internal/model/testdata/read_only_dir/a
vendored
Normal file
Reference in New Issue
Block a user