Description
CL 653856 is an optimization that increases how often make
slice results can be stored on the stack.
@dmitshur noticed that the x/sys/windows.TestBuildSecurityDescriptor test started failing on Windows after that CL was merged.
As a diagnostic step, I was able to get the test to pass again by forcing some make
results in sys/windows/security_windows.go to be heap allocated in (*SECURITY_DESCRIPTOR).ToAbsolute
.
I also then commented on the CL that from the Windows docs, it looked like the MakeAbsoluteSD
Windows API was being used in a way that was creating dangling pointers:
It looks like MakeAbsoluteSD is an example of a syscall that asks the user pass in memory that is then filled in with the results, and it looks like the results end up containing pointers to each other for some of the filled in arguments:
https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-makeabsolutesd
[...]
Previously, this would all be heap memory, but with the change in this CL, it can be stack allocated memory.I think that might mean there is a dangling pointer in absoluteSD pointing to the ToAbsolute stack after ToAbsolute returns, which might be why the test then fails.
Keith responded that there are probably other related problems as well, including in some of the related functions:
So it is allocating an object that contains pointers using a method that marks none of its fields as pointers. (And with a size which is Windows' idea of what the size is, which may or may not match what Go thinks the size is.)
Then it calls into Windows which is writing those pointer fields without any write barrier notification to the GC.
So once this thing returns, nothing is keeping the 4 things referenced from this struct alive. The next GC (or maybe the current GC, given the missing write barriers) will collect all the referenced objects, leading to dangling pointers.
That's even before this CL. After this CL things just fall apart more quickly 😊
[...]
Some of the other functions in this area have similar problems, like (*SECURITY_DESCRIPTOR).SetDACL.
Opening this issue to help track the scope of the problem and resolution.
CC @randall77
Metadata
Metadata
Assignees
Labels
Type
Projects
Status