]> Cypherpunks.ru repositories - gostls13.git/commitdiff
path/filepath: detect Windows CONIN$ and CONOUT$ paths in IsLocal
authorDamien Neil <dneil@google.com>
Thu, 17 Nov 2022 18:06:50 +0000 (10:06 -0800)
committerDamien Neil <dneil@google.com>
Thu, 17 Nov 2022 18:24:36 +0000 (18:24 +0000)
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>
src/path/filepath/path_test.go
src/path/filepath/path_windows.go

index 89fd6cb5a2d99a79a92c75342067418da7a49bab..41e70c2dbe5926ff627123d314ec54d79486e067 100644 (file)
@@ -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{
index b26658a9371aa922a391d81c6f3a39b72902eb5a..cbf57b22b439f313827f222f72972c2ddf59e9ec 100644 (file)
@@ -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
 }