Commit d154ef60 authored by Alex Brainman's avatar Alex Brainman

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: 's avatarIan Lance Taylor <iant@golang.org>
parent a70a2a8a
# go test -c -o NUL
# should work (see golang.org/issue/28035).
cd x
go test -o=$devnull -c
! exists x.test$exe
-- x/x_test.go --
package x_test
import (
"testing"
)
func TestNUL(t *testing.T) {
}
......@@ -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
}
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment