]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/path/filepath/path_test.go
path/filepath: fix various issues in parsing Windows paths
[gostls13.git] / src / path / filepath / path_test.go
index 51e6a205547e27b5b0c7dd2c373cf4fdc4484d8f..cd9f5632c9c9704973db6681592328566a67dd63 100644 (file)
@@ -116,6 +116,9 @@ var wincleantests = []PathTest{
        {`a/../c:/a`, `.\c:\a`},
        {`a/../../c:`, `..\c:`},
        {`foo:bar`, `foo:bar`},
+
+       // Don't allow cleaning to create a Root Local Device path like \??\a.
+       {`/a/../??/a`, `\.\??\a`},
 }
 
 func TestClean(t *testing.T) {
@@ -177,8 +180,28 @@ var islocaltests = []IsLocalTest{
 var winislocaltests = []IsLocalTest{
        {"NUL", false},
        {"nul", false},
+       {"nul ", false},
        {"nul.", false},
+       {"a/nul:", false},
+       {"a/nul : a", false},
+       {"com0", true},
        {"com1", false},
+       {"com2", false},
+       {"com3", false},
+       {"com4", false},
+       {"com5", false},
+       {"com6", false},
+       {"com7", false},
+       {"com8", false},
+       {"com9", false},
+       {"com¹", false},
+       {"com²", false},
+       {"com³", false},
+       {"com¹ : a", false},
+       {"cOm1", false},
+       {"lpt1", false},
+       {"LPT1", false},
+       {"lpt³", false},
        {"./nul", false},
        {`\`, false},
        {`\a`, false},
@@ -384,6 +407,7 @@ var winjointests = []JoinTest{
        {[]string{`\\a\`, `b`, `c`}, `\\a\b\c`},
        {[]string{`//`, `a`}, `\\a`},
        {[]string{`a:\b\c`, `x\..\y:\..\..\z`}, `a:\b\z`},
+       {[]string{`\`, `??\a`}, `\.\??\a`},
 }
 
 func TestJoin(t *testing.T) {
@@ -1047,6 +1071,8 @@ var winisabstests = []IsAbsTest{
        {`\\host\share\`, true},
        {`\\host\share\foo`, true},
        {`//host/share/foo/bar`, true},
+       {`\\?\a\b\c`, true},
+       {`\??\a\b\c`, true},
 }
 
 func TestIsAbs(t *testing.T) {
@@ -1547,7 +1573,8 @@ type VolumeNameTest struct {
 var volumenametests = []VolumeNameTest{
        {`c:/foo/bar`, `c:`},
        {`c:`, `c:`},
-       {`2:`, ``},
+       {`c:\`, `c:`},
+       {`2:`, `2:`},
        {``, ``},
        {`\\\host`, `\\\host`},
        {`\\\host\`, `\\\host`},
@@ -1567,12 +1594,23 @@ var volumenametests = []VolumeNameTest{
        {`//host/share//foo///bar////baz`, `\\host\share`},
        {`\\host\share\foo\..\bar`, `\\host\share`},
        {`//host/share/foo/../bar`, `\\host\share`},
+       {`//.`, `\\.`},
+       {`//./`, `\\.\`},
        {`//./NUL`, `\\.\NUL`},
-       {`//?/NUL`, `\\?\NUL`},
+       {`//?/`, `\\?`},
+       {`//./a/b`, `\\.\a`},
+       {`//?/`, `\\?`},
+       {`//?/`, `\\?`},
        {`//./C:`, `\\.\C:`},
+       {`//./C:/`, `\\.\C:`},
        {`//./C:/a/b/c`, `\\.\C:`},
        {`//./UNC/host/share/a/b/c`, `\\.\UNC\host\share`},
        {`//./UNC/host`, `\\.\UNC\host`},
+       {`//./UNC/host\`, `\\.\UNC\host\`},
+       {`//./UNC`, `\\.\UNC`},
+       {`//./UNC/`, `\\.\UNC\`},
+       {`\\?\x`, `\\?`},
+       {`\??\x`, `\??`},
 }
 
 func TestVolumeName(t *testing.T) {
@@ -1842,3 +1880,28 @@ func TestIssue51617(t *testing.T) {
                t.Errorf("got directories %v, want %v", saw, want)
        }
 }
+
+func TestEscaping(t *testing.T) {
+       dir1 := t.TempDir()
+       dir2 := t.TempDir()
+       chdir(t, dir1)
+
+       for _, p := range []string{
+               filepath.Join(dir2, "x"),
+       } {
+               if !filepath.IsLocal(p) {
+                       continue
+               }
+               f, err := os.Create(p)
+               if err != nil {
+                       f.Close()
+               }
+               ents, err := os.ReadDir(dir2)
+               if err != nil {
+                       t.Fatal(err)
+               }
+               for _, e := range ents {
+                       t.Fatalf("found: %v", e.Name())
+               }
+       }
+}