diff options
| author | qmuntal <quimmuntal@gmail.com> | 2024-10-10 11:56:56 +0200 |
|---|---|---|
| committer | Quim Muntal <quimmuntal@gmail.com> | 2024-10-10 20:07:10 +0000 |
| commit | d20a4c2403edf07f05eb024e3af568782303ce97 (patch) | |
| tree | f71c084ec8c01fb7aa17f3485f829c882bb362f5 /src/syscall | |
| parent | 9cc737d482582cca5ba44b2320fb4e48edee9cd6 (diff) | |
| download | go-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.go | 6 | ||||
| -rw-r--r-- | src/syscall/syscall_windows_test.go | 4 |
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}, |
