Do not send group/others-writable bits from Windows.

There is no user/group/others in Windows' read-only attribute,
and all "w" bits are set in os.FileInfo if the file is not read-only.
Do not send these group/others-writable bits to other devices
in order to avoid unexpected world-writable files on other platforms.
This commit is contained in:
KAMADA Ken'ichi 2015-03-15 22:14:44 +09:00
parent 1dc5c6b8a8
commit 3a6eeef580
1 changed files with 17 additions and 2 deletions

View File

@ -30,6 +30,21 @@ import (
"golang.org/x/text/unicode/norm"
)
var maskModePerm os.FileMode
func init() {
if runtime.GOOS == "windows" {
// There is no user/group/others in Windows' read-only
// attribute, and all "w" bits are set in os.FileInfo
// if the file is not read-only. Do not send these
// group/others-writable bits to other devices in order to
// avoid unexpected world-writable files on other platforms.
maskModePerm = os.ModePerm & 0755
} else {
maskModePerm = os.ModePerm
}
}
type Walker struct {
// Dir is the base directory for the walk
Dir string
@ -239,7 +254,7 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
if w.IgnorePerms {
flags |= protocol.FlagNoPermBits | 0777
} else {
flags |= uint32(info.Mode() & os.ModePerm)
flags |= uint32(info.Mode() & maskModePerm)
}
f := protocol.FileInfo{
Name: rn,
@ -277,7 +292,7 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
}
}
var flags = uint32(info.Mode() & os.ModePerm)
var flags = uint32(info.Mode() & maskModePerm)
if w.IgnorePerms {
flags = protocol.FlagNoPermBits | 0666
}