fs: fix O_NOFOLLOW for metadata handles on Windows

This commit is contained in:
Michael Eischer 2024-11-16 15:38:40 +01:00
parent 48dbefc37e
commit 6084848e5a
2 changed files with 8 additions and 2 deletions

View file

@ -5,8 +5,10 @@ package fs
// TODO honor flags when opening files // TODO honor flags when opening files
// O_NOFOLLOW is a noop on Windows. // O_NOFOLLOW is currently only interpreted by FS.OpenFile in metadataOnly mode and ignored by OpenFile.
const O_NOFOLLOW int = 0 // The value of the constant is invented and only for use within this fs package. It must not be used in other contexts.
// It must not conflict with the other O_* values from go/src/syscall/types_windows.go
const O_NOFOLLOW int = 0x40000000
// O_DIRECTORY is a noop on Windows. // O_DIRECTORY is a noop on Windows.
const O_DIRECTORY int = 0 const O_DIRECTORY int = 0

View file

@ -3,6 +3,7 @@ package fs
import ( import (
"fmt" "fmt"
"os" "os"
"runtime"
) )
// MkdirAll creates a directory named path, along with any necessary parents, // MkdirAll creates a directory named path, along with any necessary parents,
@ -47,6 +48,9 @@ func Lstat(name string) (os.FileInfo, error) {
// methods on the returned File can be used for I/O. // methods on the returned File can be used for I/O.
// If there is an error, it will be of type *PathError. // If there is an error, it will be of type *PathError.
func OpenFile(name string, flag int, perm os.FileMode) (*os.File, error) { func OpenFile(name string, flag int, perm os.FileMode) (*os.File, error) {
if runtime.GOOS == "windows" {
flag &^= O_NOFOLLOW
}
return os.OpenFile(fixpath(name), flag, perm) return os.OpenFile(fixpath(name), flag, perm)
} }