os: handle backslash and slash both in the path on Windows

Fixes #35492

Change-Id: I00dce8fd1228f809e0c61013ac4de7a5953cbbf9
Reviewed-on: https://go-review.googlesource.com/c/go/+/206997
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/src/os/file_windows.go b/src/os/file_windows.go
index 1e78f4e..96f934d 100644
--- a/src/os/file_windows.go
+++ b/src/os/file_windows.go
@@ -111,10 +111,17 @@
 
 	path := fixLongPath(name)
 
-	if len(path) == 2 && path[1] == ':' || (len(path) > 0 && path[len(path)-1] == '\\') { // it is a drive letter, like C:
+	if len(path) == 2 && path[1] == ':' { // it is a drive letter, like C:
 		mask = path + `*`
+	} else if len(path) > 0 {
+		lc := path[len(path)-1]
+		if lc == '/' || lc == '\\' {
+			mask = path + `*`
+		} else {
+			mask = path + `\*`
+		}
 	} else {
-		mask = path + `\*`
+		mask = `\*`
 	}
 	maskp, e := syscall.UTF16PtrFromString(mask)
 	if e != nil {
diff --git a/src/os/path_windows_test.go b/src/os/path_windows_test.go
index f1745ad..862b404 100644
--- a/src/os/path_windows_test.go
+++ b/src/os/path_windows_test.go
@@ -74,3 +74,18 @@
 		t.Fatalf("MkdirAll(%q) should have failed, but did not", path)
 	}
 }
+
+func TestOpenRootSlash(t *testing.T) {
+	tests := []string{
+		`/`,
+		`\`,
+	}
+
+	for _, test := range tests {
+		dir, err := os.Open(test)
+		if err != nil {
+			t.Fatalf("Open(%q) failed: %v", test, err)
+		}
+		dir.Close()
+	}
+}