aboutsummaryrefslogtreecommitdiff
path: root/src/syscall
diff options
context:
space:
mode:
authorqmuntal <quimmuntal@gmail.com>2024-10-10 11:56:56 +0200
committerQuim Muntal <quimmuntal@gmail.com>2024-10-10 20:07:10 +0000
commitd20a4c2403edf07f05eb024e3af568782303ce97 (patch)
treef71c084ec8c01fb7aa17f3485f829c882bb362f5 /src/syscall
parent9cc737d482582cca5ba44b2320fb4e48edee9cd6 (diff)
downloadgo-d20a4c2403edf07f05eb024e3af568782303ce97.tar.xz
syscall: support more flags when opening directories on Windows
syscall.Open was artificially limiting the flags that were eligible to open directories on Windows. This change extend the cases where we pass FILE_FLAG_BACKUP_SEMANTICS to all flag combinations allowed by Unix. Change-Id: Ia7c083bcba070f92ea61c6d67487bdefd0d99546 Reviewed-on: https://go-review.googlesource.com/c/go/+/619295 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Damien Neil <dneil@google.com>
Diffstat (limited to 'src/syscall')
-rw-r--r--src/syscall/syscall_windows.go6
-rw-r--r--src/syscall/syscall_windows_test.go4
2 files changed, 6 insertions, 4 deletions
diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go
index 84d6550c16..db1f4f2ba4 100644
--- a/src/syscall/syscall_windows.go
+++ b/src/syscall/syscall_windows.go
@@ -388,8 +388,10 @@ func Open(name string, flag int, perm uint32) (fd Handle, err error) {
if perm&S_IWRITE == 0 {
attrs = FILE_ATTRIBUTE_READONLY
}
- if createmode == OPEN_EXISTING && access == GENERIC_READ {
- // Necessary for opening directory handles.
+ if flag&O_WRONLY == 0 && flag&O_RDWR == 0 {
+ // We might be opening or creating a directory.
+ // CreateFile requires FILE_FLAG_BACKUP_SEMANTICS
+ // to work with directories.
attrs |= FILE_FLAG_BACKUP_SEMANTICS
}
if flag&O_SYNC != 0 {
diff --git a/src/syscall/syscall_windows_test.go b/src/syscall/syscall_windows_test.go
index 03821ea594..ea1e8c9b3c 100644
--- a/src/syscall/syscall_windows_test.go
+++ b/src/syscall/syscall_windows_test.go
@@ -24,8 +24,8 @@ func TestOpen_Dir(t *testing.T) {
err error
}{
{syscall.O_RDONLY, nil},
- {syscall.O_CREAT, syscall.ERROR_ACCESS_DENIED}, // TODO(qmuntal): should be allowed.
- {syscall.O_RDONLY | syscall.O_CREAT, syscall.ERROR_ACCESS_DENIED}, // TODO(qmuntal): should be allowed.
+ {syscall.O_CREAT, nil},
+ {syscall.O_RDONLY | syscall.O_CREAT, nil},
{syscall.O_RDONLY | syscall.O_TRUNC, syscall.ERROR_ACCESS_DENIED},
{syscall.O_WRONLY | syscall.O_RDWR, syscall.EISDIR},
{syscall.O_WRONLY, syscall.EISDIR},