test(safeio): expose native Windows DACL shape

This commit is contained in:
2026-08-18 13:00:23 +02:00
parent a0e05ad392
commit 747b4200d9
@@ -9,6 +9,7 @@ import (
"runtime"
"strings"
"testing"
"unsafe"
"golang.org/x/sys/windows"
)
@@ -68,6 +69,72 @@ func TestOwnerOnlyDACLAcceptsWindowsFullControlMask(t *testing.T) {
}
}
func TestOwnerOnlyDACLNativeShape(t *testing.T) {
directory := filepath.Join(t.TempDir(), "auth")
if err := os.Mkdir(directory, 0o700); err != nil {
t.Fatal(err)
}
parents, target, err := openCanonicalWindowsParent(directory)
if err != nil {
t.Fatalf("openCanonicalWindowsParent() error = %T %v", err, err)
}
defer parents.Close()
handle, err := openWindowsRelativeComponent(
parents.handles[len(parents.handles)-1],
target,
true,
windows.GENERIC_READ|windows.WRITE_DAC|windows.WRITE_OWNER,
)
if err != nil {
t.Fatalf("openWindowsRelativeComponent() error = %T %v", err, err)
}
defer windows.CloseHandle(handle)
if err := setOwnerOnlyDACL(handle); err != nil {
t.Fatalf("setOwnerOnlyDACL() error = %T %v", err, err)
}
descriptor, err := windows.GetSecurityInfo(handle, windows.SE_FILE_OBJECT,
windows.OWNER_SECURITY_INFORMATION|windows.DACL_SECURITY_INFORMATION)
if err != nil || descriptor == nil {
t.Fatalf("GetSecurityInfo() error = %T %v descriptor=%p", err, err, descriptor)
}
owner, ownerDefaulted, err := descriptor.Owner()
if err != nil || owner == nil {
t.Fatalf("security descriptor owner error = %T %v owner=%p defaulted=%t", err, err, owner, ownerDefaulted)
}
control, _, err := descriptor.Control()
if err != nil {
t.Fatalf("security descriptor control error = %T %v", err, err)
}
dacl, daclDefaulted, err := descriptor.DACL()
if err != nil || dacl == nil {
t.Fatalf("security descriptor DACL error = %T %v dacl=%p defaulted=%t control=%#x", err, err, dacl, daclDefaulted, uint16(control))
}
if dacl.AceCount != 1 {
t.Fatalf("security descriptor ACE count = %d, want 1 (control=%#x)", dacl.AceCount, uint16(control))
}
var ace *windows.ACCESS_ALLOWED_ACE
if err := windows.GetAce(dacl, 0, &ace); err != nil || ace == nil {
t.Fatalf("security descriptor ACE error = %T %v ace=%p", err, err, ace)
}
ownerSID, err := currentOwnerSID()
if err != nil {
t.Fatalf("currentOwnerSID() error = %T %v", err, err)
}
aceSID := (*windows.SID)(unsafe.Pointer(&ace.SidStart))
if !windows.EqualSid(owner, ownerSID) || !windows.EqualSid(aceSID, ownerSID) ||
control&windows.SE_DACL_PROTECTED == 0 || daclDefaulted ||
ace.Header.AceType != windows.ACCESS_ALLOWED_ACE_TYPE || ace.Header.AceFlags != 0 ||
!isOwnerOnlyFullControlMask(uint32(ace.Mask)) {
t.Fatalf("owner-only DACL shape invalid: ownerMatch=%t aceOwnerMatch=%t control=%#x daclDefaulted=%t aceType=%d aceFlags=%#x mask=%#x",
windows.EqualSid(owner, ownerSID), windows.EqualSid(aceSID, ownerSID), uint16(control), daclDefaulted,
ace.Header.AceType, ace.Header.AceFlags, uint32(ace.Mask))
}
if err := validateOwnerOnlyDACL(handle); err != nil {
t.Fatalf("validateOwnerOnlyDACL() rejected native shape: %T %v (control=%#x mask=%#x)", err, err, uint16(control), uint32(ace.Mask))
}
}
func TestWindowsPrivateRegularCleanupClosesAfterDeleteDispositionFailure(t *testing.T) {
var calls []string
err := finishWindowsPrivateRegularCleanup(