]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: support more flags when opening directories on Windows
authorqmuntal <quimmuntal@gmail.com>
Thu, 10 Oct 2024 09:56:56 +0000 (11:56 +0200)
committerQuim Muntal <quimmuntal@gmail.com>
Thu, 10 Oct 2024 20:07:10 +0000 (20:07 +0000)
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>
src/syscall/syscall_windows.go
src/syscall/syscall_windows_test.go

index 84d6550c1633e6993bf4ba824520bbfb6bfdf706..db1f4f2ba4d2cbee083ed0ddf97197c5e50c2a75 100644 (file)
@@ -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 {
index 03821ea594d8be7666ed4e1577b84bdec5766f75..ea1e8c9b3c2fa5d3e609d2b67d7b9070569bb699 100644 (file)
@@ -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},