lib/fs: Try EvalSymlinks without '\\?\' prefix on failure (fixes #5226) (#5227)

This commit is contained in:
Simon Frei 2018-09-26 20:28:20 +02:00 committed by Audrius Butkevicius
parent 91c3218a0c
commit 03d0f0dc34
4 changed files with 17 additions and 6 deletions

View File

@ -11,6 +11,7 @@ package fs
import (
"fmt"
"os"
"path/filepath"
"strings"
)
@ -73,3 +74,5 @@ func (f *BasicFilesystem) unrootedChecked(absPath, root string) string {
func rel(path, prefix string) string {
return strings.TrimPrefix(strings.TrimPrefix(path, prefix), string(PathSeparator))
}
var evalSymlinks = filepath.EvalSymlinks

View File

@ -12,7 +12,6 @@ import (
"context"
"errors"
"path/filepath"
"runtime"
"github.com/syncthing/notify"
)
@ -23,13 +22,10 @@ import (
var backendBuffer = 500
func (f *BasicFilesystem) Watch(name string, ignore Matcher, ctx context.Context, ignorePerms bool) (<-chan Event, error) {
evalRoot, err := filepath.EvalSymlinks(f.root)
evalRoot, err := evalSymlinks(f.root)
if err != nil {
return nil, err
}
if runtime.GOOS == "windows" {
evalRoot = longFilenameSupport(evalRoot)
}
absName, err := rooted(name, evalRoot)
if err != nil {

View File

@ -34,7 +34,7 @@ func TestMain(m *testing.M) {
panic("Cannot get absolute path to working dir")
}
dir, err = filepath.EvalSymlinks(dir)
dir, err = evalSymlinks(dir)
if err != nil {
panic("Cannot get real path to working dir")
}

View File

@ -210,3 +210,15 @@ func isMaybeWin83(absPath string) bool {
}
return strings.Contains(strings.TrimPrefix(filepath.Base(absPath), WindowsTempPrefix), "~")
}
func evalSymlinks(in string) (string, error) {
out, err := filepath.EvalSymlinks(in)
if err != nil && strings.HasPrefix(in, `\\?\`) {
// Try again without the `\\?\` prefix
out, err = filepath.EvalSymlinks(in[4:])
}
if err != nil {
return "", err
}
return longFilenameSupport(out), nil
}