mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-08 22:31:04 +00:00
lib/fs: Improve root check (#6033)
The root check would allow things like c:\foobar\baz if the root was c:\foo, because string wise that's a prefix. Now it doesn't.
This commit is contained in:
parent
fd2e91c82d
commit
52d80d8144
@ -62,6 +62,10 @@ func (f *BasicFilesystem) Roots() ([]string, error) {
|
|||||||
// pathseparator.
|
// pathseparator.
|
||||||
func (f *BasicFilesystem) unrootedChecked(absPath string, roots []string) (string, *ErrWatchEventOutsideRoot) {
|
func (f *BasicFilesystem) unrootedChecked(absPath string, roots []string) (string, *ErrWatchEventOutsideRoot) {
|
||||||
for _, root := range roots {
|
for _, root := range roots {
|
||||||
|
// Make sure the root ends with precisely one path separator, to
|
||||||
|
// ease prefix comparisons.
|
||||||
|
root := strings.TrimRight(root, string(PathSeparator)) + string(PathSeparator)
|
||||||
|
|
||||||
if absPath+string(PathSeparator) == root {
|
if absPath+string(PathSeparator) == root {
|
||||||
return ".", nil
|
return ".", nil
|
||||||
}
|
}
|
||||||
|
@ -201,23 +201,33 @@ func TestWatchWinRoot(t *testing.T) {
|
|||||||
|
|
||||||
// TestWatchOutside checks that no changes from outside the folder make it in
|
// TestWatchOutside checks that no changes from outside the folder make it in
|
||||||
func TestWatchOutside(t *testing.T) {
|
func TestWatchOutside(t *testing.T) {
|
||||||
|
expectErrorForPath(t, filepath.Join(filepath.Dir(testDirAbs), "outside"))
|
||||||
|
|
||||||
|
rootWithoutSlash := strings.TrimRight(filepath.ToSlash(testDirAbs), "/")
|
||||||
|
expectErrorForPath(t, rootWithoutSlash+"outside")
|
||||||
|
expectErrorForPath(t, rootWithoutSlash+"outside/thing")
|
||||||
|
}
|
||||||
|
|
||||||
|
func expectErrorForPath(t *testing.T, path string) {
|
||||||
outChan := make(chan Event)
|
outChan := make(chan Event)
|
||||||
backendChan := make(chan notify.EventInfo, backendBuffer)
|
backendChan := make(chan notify.EventInfo, backendBuffer)
|
||||||
errChan := make(chan error)
|
errChan := make(chan error)
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
// testFs is Filesystem, but we need BasicFilesystem here
|
// testFs is Filesystem, but we need BasicFilesystem here
|
||||||
fs := newBasicFilesystem(testDirAbs)
|
fs := newBasicFilesystem(testDirAbs)
|
||||||
|
|
||||||
go fs.watchLoop(".", []string{testDirAbs}, backendChan, outChan, errChan, fakeMatcher{}, ctx)
|
go fs.watchLoop(".", []string{testDirAbs}, backendChan, outChan, errChan, fakeMatcher{}, ctx)
|
||||||
|
|
||||||
backendChan <- fakeEventInfo(filepath.Join(filepath.Dir(testDirAbs), "outside"))
|
backendChan <- fakeEventInfo(path)
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case <-time.After(10 * time.Second):
|
case <-time.After(10 * time.Second):
|
||||||
cancel()
|
|
||||||
t.Errorf("Timed out before receiving error")
|
t.Errorf("Timed out before receiving error")
|
||||||
|
case e := <-outChan:
|
||||||
|
t.Errorf("Unexpected passed through event %v", e)
|
||||||
case <-errChan:
|
case <-errChan:
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user