Test added.
Fixes #24556
Change-Id: I4d1cd4513142edeea1a983fbfde46c2fccecab2a
Reviewed-on: https://go-review.googlesource.com/c/go/+/186139
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
// bits (before umask).
// If there is an error, it will be of type *PathError.
func Mkdir(name string, perm FileMode) error {
+ if runtime.GOOS == "windows" && isWindowsNulName(name) {
+ return &PathError{"mkdir", name, syscall.ENOTDIR}
+ }
e := syscall.Mkdir(fixLongPath(name), syscallMode(perm))
if e != nil {
}
return newRawConn(f)
}
+
+// isWindowsNulName reports whether name is os.DevNull ('NUL') on Windows.
+// True is returned if name is 'NUL' whatever the case.
+func isWindowsNulName(name string) bool {
+ if len(name) != 3 {
+ return false
+ }
+ if name[0] != 'n' && name[0] != 'N' {
+ return false
+ }
+ if name[1] != 'u' && name[1] != 'U' {
+ return false
+ }
+ if name[2] != 'l' && name[2] != 'L' {
+ return false
+ }
+ return true
+}
mklink(t, "relfilelink", "file")
testReadlink(t, "relfilelink", "file")
}
+
+// os.Mkdir(os.DevNull) fails.
+func TestMkdirDevNull(t *testing.T) {
+ err := os.Mkdir(os.DevNull, 777)
+ oserr, ok := err.(*os.PathError)
+ if !ok {
+ t.Fatalf("error (%T) is not *os.PathError", err)
+ }
+ errno, ok := oserr.Err.(syscall.Errno)
+ if !ok {
+ t.Fatalf("error (%T) is not syscall.Errno", oserr)
+ }
+ if errno != syscall.ENOTDIR {
+ t.Fatalf("error %d is not syscall.ENOTDIR", errno)
+ }
+}
\ No newline at end of file
"unsafe"
)
-// isNulName reports whether name is NUL file name.
-// For example, it returns true for both "NUL" and "nul".
-func isNulName(name string) bool {
- if len(name) != 3 {
- return false
- }
- if name[0] != 'n' && name[0] != 'N' {
- return false
- }
- if name[1] != 'u' && name[1] != 'U' {
- return false
- }
- if name[2] != 'l' && name[2] != 'L' {
- return false
- }
- return true
-}
-
// Stat returns the FileInfo structure describing file.
// If there is an error, it will be of type *PathError.
func (file *File) Stat() (FileInfo, error) {
// I don't know any better way to do that for directory
return Stat(file.dirinfo.path)
}
- if isNulName(file.name) {
+ if isWindowsNulName(file.name) {
return &devNullStat, nil
}
if len(name) == 0 {
return nil, &PathError{funcname, name, syscall.Errno(syscall.ERROR_PATH_NOT_FOUND)}
}
- if isNulName(name) {
+ if isWindowsNulName(name) {
return &devNullStat, nil
}
namep, err := syscall.UTF16PtrFromString(fixLongPath(name))