aboutsummaryrefslogtreecommitdiff
path: root/src/path
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2018-10-21 14:57:58 +1100
committerAlex Brainman <alex.brainman@gmail.com>2018-11-02 07:24:50 +0000
commitd154ef60a0c88be98c70bbe1c5735fb7b1f45250 (patch)
treece4550c7a6ee275606f10f3474afc6a576a2a83a /src/path
parenta70a2a8ad69f481d5fcaf9e006e224fbab7df754 (diff)
downloadgo-d154ef60a0c88be98c70bbe1c5735fb7b1f45250.tar.gz
go-d154ef60a0c88be98c70bbe1c5735fb7b1f45250.zip
path/filepath: change IsAbs("NUL") to return true
This CL changes IsAbs to return true for "NUL" and other Windows reserved filenames (search https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file for NUL for details). os.Open("NUL") and os.Stat("NUL") work regardless of what current directory is, and it is mistake to join "NUL" with current directory when building full path. Changing IsAbs("NUL") to return true fixes that mistake. Fixes #28035 Change-Id: Ife8f8aee48400702613ede8fc6834fd43e6e0f03 Reviewed-on: https://go-review.googlesource.com/c/145220 Run-TryBot: Alex Brainman <alex.brainman@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/path')
-rw-r--r--src/path/filepath/path_test.go5
-rw-r--r--src/path/filepath/path_windows.go26
2 files changed, 31 insertions, 0 deletions
diff --git a/src/path/filepath/path_test.go b/src/path/filepath/path_test.go
index eddae4755b..3434ea2e6e 100644
--- a/src/path/filepath/path_test.go
+++ b/src/path/filepath/path_test.go
@@ -751,6 +751,11 @@ func TestIsAbs(t *testing.T) {
for _, test := range isabstests {
tests = append(tests, IsAbsTest{"c:" + test.path, test.isAbs})
}
+ // Test reserved names.
+ tests = append(tests, IsAbsTest{os.DevNull, true})
+ tests = append(tests, IsAbsTest{"NUL", true})
+ tests = append(tests, IsAbsTest{"nul", true})
+ tests = append(tests, IsAbsTest{"CON", true})
} else {
tests = isabstests
}
diff --git a/src/path/filepath/path_windows.go b/src/path/filepath/path_windows.go
index 6a144d9e0b..445c868e41 100644
--- a/src/path/filepath/path_windows.go
+++ b/src/path/filepath/path_windows.go
@@ -13,8 +13,34 @@ func isSlash(c uint8) bool {
return c == '\\' || c == '/'
}
+// reservedNames lists reserved Windows names. Search for PRN in
+// https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file
+// for details.
+var reservedNames = []string{
+ "CON", "PRN", "AUX", "NUL",
+ "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
+ "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9",
+}
+
+// isReservedName returns true, if path is Windows reserved name.
+// See reservedNames for the full list.
+func isReservedName(path string) bool {
+ if len(path) == 0 {
+ return false
+ }
+ for _, reserved := range reservedNames {
+ if strings.EqualFold(path, reserved) {
+ return true
+ }
+ }
+ return false
+}
+
// IsAbs reports whether the path is absolute.
func IsAbs(path string) (b bool) {
+ if isReservedName(path) {
+ return true
+ }
l := volumeNameLen(path)
if l == 0 {
return false