aboutsummaryrefslogtreecommitdiff
path: root/src/path/filepath
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2022-11-17 10:06:50 -0800
committerDamien Neil <dneil@google.com>2022-11-17 18:24:36 +0000
commit217ed955887bd59780313bb468862a697b75decd (patch)
treeaff29b8e22094702e9878651b1b47b9b606fd818 /src/path/filepath
parent38b9ff60071fc40d197e7002db1320539e74a678 (diff)
downloadgo-217ed955887bd59780313bb468862a697b75decd.tar.xz
path/filepath: detect Windows CONIN$ and CONOUT$ paths in IsLocal
CreateFile creates a handle to the console input or screen buffer when opening a file named CONIN$ or CONOUT$: https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea#consoles Detect these paths as non-local. For #56219. Change-Id: Ib09e76a110d6ec09aef8038074b9bcbae09d00d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/451657 Run-TryBot: Damien Neil <dneil@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Bryan Mills <bcmills@google.com>
Diffstat (limited to 'src/path/filepath')
-rw-r--r--src/path/filepath/path_test.go5
-rw-r--r--src/path/filepath/path_windows.go13
2 files changed, 17 insertions, 1 deletions
diff --git a/src/path/filepath/path_test.go b/src/path/filepath/path_test.go
index 89fd6cb5a2..41e70c2dbe 100644
--- a/src/path/filepath/path_test.go
+++ b/src/path/filepath/path_test.go
@@ -174,6 +174,11 @@ var winislocaltests = []IsLocalTest{
{`C:`, false},
{`C:\a`, false},
{`..\a`, false},
+ {`CONIN$`, false},
+ {`conin$`, false},
+ {`CONOUT$`, false},
+ {`conout$`, false},
+ {`dollar$`, true}, // not a special file name
}
var plan9islocaltests = []IsLocalTest{
diff --git a/src/path/filepath/path_windows.go b/src/path/filepath/path_windows.go
index b26658a937..cbf57b22b4 100644
--- a/src/path/filepath/path_windows.go
+++ b/src/path/filepath/path_windows.go
@@ -20,7 +20,7 @@ func toUpper(c byte) byte {
return c
}
-// isReservedName reports if name is a Windows reserved device name.
+// isReservedName reports if name is a Windows reserved device name or a console handle.
// It does not detect names with an extension, which are also reserved on some Windows versions.
//
// For details, search for PRN in
@@ -34,6 +34,17 @@ func isReservedName(name string) bool {
return len(name) == 4 && '1' <= name[3] && name[3] <= '9'
}
}
+ // Passing CONIN$ or CONOUT$ to CreateFile opens a console handle.
+ // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea#consoles
+ //
+ // While CONIN$ and CONOUT$ aren't documented as being files,
+ // they behave the same as CON. For example, ./CONIN$ also opens the console input.
+ if len(name) == 6 && name[5] == '$' && strings.EqualFold(name, "CONIN$") {
+ return true
+ }
+ if len(name) == 7 && name[6] == '$' && strings.EqualFold(name, "CONOUT$") {
+ return true
+ }
return false
}