From 217ed955887bd59780313bb468862a697b75decd Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Thu, 17 Nov 2022 10:06:50 -0800 Subject: [PATCH] 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 TryBot-Result: Gopher Robot Reviewed-by: Bryan Mills --- src/path/filepath/path_test.go | 5 +++++ src/path/filepath/path_windows.go | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) 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 } -- 2.50.0