Skip to content

[cDAC] Fix context alignment and content on debug validation paths#129720

Open
rcj1 wants to merge 1 commit into
dotnet:mainfrom
rcj1:fix-validation-sw
Open

[cDAC] Fix context alignment and content on debug validation paths#129720
rcj1 wants to merge 1 commit into
dotnet:mainfrom
rcj1:fix-validation-sw

Conversation

@rcj1

@rcj1 rcj1 commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Ensure that buffers passed into debug validation are 16-aligned. Also ensure that native memory is cleared before writing into it.

@rcj1 rcj1 changed the title Fix context alignment and content on debug validation paths [cDAC] Fix context alignment and content on debug validation paths Jun 22, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adjusts cDAC interop/debug-validation code paths to (1) ensure thread/context buffers are 16-byte aligned before being passed to callbacks/legacy implementations and (2) clear native buffers before they’re written/compared, reducing the chance of alignment faults and spurious diffs from uninitialized bytes.

Changes:

  • Zero-initialize the temporary aligned buffer used when calling the readThreadContext delegate in mscordaccore_universal.
  • Replace byte[] + fixed with NativeMemory.AlignedAlloc(..., 16) in legacy stack-walk validation paths, and clear the native buffer before calling legacy APIs.
Show a summary per file
File Description
src/native/managed/cdac/mscordaccore_universal/Entrypoints.cs Clears the temporary aligned buffer before invoking readThreadContext.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.cs Uses 16-byte-aligned native buffers (and clears them) when calling legacy stack-walk APIs for validation.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 5

Comment on lines 1346 to +1348
uint contextSize = IPlatformAgnosticContext.GetContextForPlatform(_target).Size;
byte[] localContextBuf = new byte[contextSize];
nuint legacyHandle = 0;
fixed (byte* pLocal = localContextBuf)
byte* pLocal = (byte*)NativeMemory.AlignedAlloc(contextSize, 16);
byte* pLocal = (byte*)NativeMemory.AlignedAlloc(contextSize, 16);
try
{
new Span<byte>(pLocal, (int)contextSize).Clear();
{
byte[] localContextBuf = new byte[contextSize];
fixed (byte* pLocal = localContextBuf)
byte* pLocal = (byte*)NativeMemory.AlignedAlloc(contextSize, 16);
byte* pLocal = (byte*)NativeMemory.AlignedAlloc(contextSize, 16);
try
{
new Span<byte>(pLocal, (int)contextSize).Clear();
Comment on lines 1344 to +1348
if (_legacy is not null && LegacyFallbackHelper.CanFallback())
{
uint contextSize = IPlatformAgnosticContext.GetContextForPlatform(_target).Size;
byte[] localContextBuf = new byte[contextSize];
nuint legacyHandle = 0;
fixed (byte* pLocal = localContextBuf)
byte* pLocal = (byte*)NativeMemory.AlignedAlloc(contextSize, 16);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants