Ignore AppDomain address parameters in ISOSDacInterface - #129476

Merged
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr
Jun 17, 2026
Merged

Ignore AppDomain address parameters in ISOSDacInterface#129476
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 16, 2026

Copy link
Copy Markdown
Member

Note

This PR was created with assistance from GitHub Copilot.

CoreCLR only has a single AppDomain. The addr/domain parameters passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName are historical artifacts from the multi-AppDomain era (.NET Framework). These methods now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain() (cDAC) directly instead of trusting the caller-provided address.

Changes

DAC (request.cpp):

  • GetAppDomainData -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAssemblyList -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAppDomainName -- uses AppDomain::GetCurrentDomain() instead of casting addr

cDAC (SOSDacImpl.cs):

  • Same 3 methods use loader.GetAppDomain() instead of the input address

All addr == 0 precondition checks are removed since the parameter is no longer used.

Testing

All cDAC unit tests pass (2509 passed, 0 failed).

Follow-up from

#129260

Successful runtime-diagnostics run: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results

@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.

CopilotAI 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 updates the SOS DAC (ISOSDacInterface) AppDomain-related APIs to stop trusting the caller-provided AppDomain address and instead query the current/default AppDomain directly (native DAC: AppDomain::GetCurrentDomain(), cDAC: ILoader.GetAppDomain()), reflecting CoreCLR’s single-AppDomain model.

Changes:

  • Native DAC (request.cpp): GetAppDomainData, GetAssemblyList, and GetAppDomainName now use AppDomain::GetCurrentDomain() and no longer validate addr != 0.
  • cDAC (SOSDacImpl.cs): the same methods now use loader.GetAppDomain() and no longer validate addr != 0.
  • Removes addr == 0 precondition checks since addr is no longer used.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csSwitches AppDomain-dependent methods to use ILoader.GetAppDomain() instead of the input address.
src/coreclr/debug/daccess/request.cppSwitches AppDomain-dependent methods to use AppDomain::GetCurrentDomain() instead of the input address.

Comment threadsrc/coreclr/debug/daccess/request.cpp Outdated
@github-actions

This comment has been minimized.

CoreCLR only has a single AppDomain. The addr/domain parameters
passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName
are historical artifacts from the multi-AppDomain era. These methods
now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain()
(cDAC) directly instead of trusting the caller-provided address.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@max-charlamb
max-charlambforce-pushed the maxcharlamb/ignore-appdomain-addr branch from 011b745 to da24b3cCompareJune 16, 2026 20:22
@github-actions

Copy link
Copy Markdown
Contributor

Copilot Code Review

Holistic Assessment

Motivation: Well-justified follow-up to #129260. CoreCLR has exactly one AppDomain, so the addr parameter in these three ISOSDacInterface methods was dead weight from the .NET Framework era. Removing its usage eliminates a class of potential bugs where callers could pass stale/wrong addresses.

Approach: Correct and minimal — replaces PTR_AppDomain(TO_TADDR(addr)) with AppDomain::GetCurrentDomain() in native DAC and loader.GetAppDomain() in cDAC. The null-check on the result (returning E_FAIL / throwing) is a sensible defensive guard for the extreme edge case of diagnostics attaching before AppDomain initialization.

Summary: ✅ LGTM. Clean, focused change that correctly eliminates dead parameter usage in GetAppDomainData, GetAssemblyList, and GetAppDomainName across both DAC and cDAC. One minor observation below (non-blocking).


Detailed Findings

Detailed Findings

✅ Correctness — Safe behavioral change

The removal of addr == 0 → E_INVALIDARG checks is correct because addr is now completely unused. The new GetCurrentDomain() == NULL → E_FAIL path is a safer guard — it protects against the (unlikely) scenario of diagnostics attaching before the AppDomain is constructed, rather than checking for a meaningless caller error.

In GetAssemblyList, moving the validation inside SOSDacEnter() / SOSDacLeave() (instead of the old early-return before SOSDacEnter) is actually a consistency improvement, matching the pattern in GetAppDomainData.

✅ DAC/cDAC alignment — Consistent approach

Both native DAC and managed cDAC make the same logical change for all three methods. The cDAC GetAppDomainName already ignored addr (calling loader.GetAppDomainFriendlyName() with no address argument); this PR correctly adds only the documenting comment there.

💡 Minor — HRESULT discrepancy in null-AppDomain error path (non-blocking)

When GetAppDomain() returns null in the cDAC path (GetAppDomainData, GetAssemblyList), the code throws InvalidOperationException, whose default HResult is COR_E_INVALIDOPERATION (0x80131509). The native DAC returns E_FAIL (0x80004005) in the same scenario. The #if DEBUG validation blocks would flag this mismatch if it were ever hit.

This is non-blocking because:

  1. The AppDomain is initialized extremely early — this path is practically unreachable when diagnostics tools are attached.
  2. Both return "failure" to the caller; the specific HRESULT distinction is unlikely to matter.

If you wanted perfect parity, you could use Marshal.ThrowExceptionForHR(HResults.E_FAIL) or a COMException with E_FAIL, but this is strictly optional.

✅ Scope — Appropriately focused

GetFailedAssemblyList (line 2594 in request.cpp) still uses the caller-provided address, which is correctly documented as out-of-scope for this PR.

Note

This review was created by GitHub Copilot.

Generated by Code Review for issue #129476 · ● 16.6M ·

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-diagnostics

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@max-charlamb
max-charlamb marked this pull request as ready for review June 17, 2026 14:26

CopilotAI 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

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@max-charlamb
max-charlamb enabled auto-merge (squash) June 17, 2026 14:48
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g SOSTests passed

@max-charlamb
max-charlamb merged commit 7117272 into mainJun 17, 2026
104 of 140 checks passed
@max-charlamb
max-charlamb deleted the maxcharlamb/ignore-appdomain-addr branch June 17, 2026 16:41
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 18, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!NOTE]
> This PR was created with assistance from GitHub Copilot.
CoreCLR only has a single AppDomain. The `addr`/`domain` parameters
passed to `GetAppDomainData`, `GetAssemblyList`, and `GetAppDomainName`
are historical artifacts from the multi-AppDomain era (.NET Framework).
These methods now use `AppDomain::GetCurrentDomain()` (DAC) or
`ILoader.GetAppDomain()` (cDAC) directly instead of trusting the
caller-provided address.
### Changes
**DAC (`request.cpp`):**
- `GetAppDomainData` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAssemblyList` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAppDomainName` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
**cDAC (`SOSDacImpl.cs`):**
- Same 3 methods use `loader.GetAppDomain()` instead of the input
address
All `addr == 0` precondition checks are removed since the parameter is
no longer used.
### Testing
All cDAC unit tests pass (2509 passed, 0 failed).
### Follow-up from
#129260
Successful runtime-diagnostics run:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 19, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@max-charlamb@steveisok@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Ignore AppDomain address parameters in ISOSDacInterface - #129476

Merged
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr
Jun 17, 2026
Merged

Ignore AppDomain address parameters in ISOSDacInterface#129476
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 16, 2026

Copy link
Copy Markdown
Member

Note

This PR was created with assistance from GitHub Copilot.

CoreCLR only has a single AppDomain. The addr/domain parameters passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName are historical artifacts from the multi-AppDomain era (.NET Framework). These methods now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain() (cDAC) directly instead of trusting the caller-provided address.

Changes

DAC (request.cpp):

  • GetAppDomainData -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAssemblyList -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAppDomainName -- uses AppDomain::GetCurrentDomain() instead of casting addr

cDAC (SOSDacImpl.cs):

  • Same 3 methods use loader.GetAppDomain() instead of the input address

All addr == 0 precondition checks are removed since the parameter is no longer used.

Testing

All cDAC unit tests pass (2509 passed, 0 failed).

Follow-up from

#129260

Successful runtime-diagnostics run: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results

@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.

CopilotAI 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 updates the SOS DAC (ISOSDacInterface) AppDomain-related APIs to stop trusting the caller-provided AppDomain address and instead query the current/default AppDomain directly (native DAC: AppDomain::GetCurrentDomain(), cDAC: ILoader.GetAppDomain()), reflecting CoreCLR’s single-AppDomain model.

Changes:

  • Native DAC (request.cpp): GetAppDomainData, GetAssemblyList, and GetAppDomainName now use AppDomain::GetCurrentDomain() and no longer validate addr != 0.
  • cDAC (SOSDacImpl.cs): the same methods now use loader.GetAppDomain() and no longer validate addr != 0.
  • Removes addr == 0 precondition checks since addr is no longer used.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csSwitches AppDomain-dependent methods to use ILoader.GetAppDomain() instead of the input address.
src/coreclr/debug/daccess/request.cppSwitches AppDomain-dependent methods to use AppDomain::GetCurrentDomain() instead of the input address.

Comment threadsrc/coreclr/debug/daccess/request.cpp Outdated
@github-actions

This comment has been minimized.

CoreCLR only has a single AppDomain. The addr/domain parameters
passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName
are historical artifacts from the multi-AppDomain era. These methods
now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain()
(cDAC) directly instead of trusting the caller-provided address.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@max-charlamb
max-charlambforce-pushed the maxcharlamb/ignore-appdomain-addr branch from 011b745 to da24b3cCompareJune 16, 2026 20:22
@github-actions

Copy link
Copy Markdown
Contributor

Copilot Code Review

Holistic Assessment

Motivation: Well-justified follow-up to #129260. CoreCLR has exactly one AppDomain, so the addr parameter in these three ISOSDacInterface methods was dead weight from the .NET Framework era. Removing its usage eliminates a class of potential bugs where callers could pass stale/wrong addresses.

Approach: Correct and minimal — replaces PTR_AppDomain(TO_TADDR(addr)) with AppDomain::GetCurrentDomain() in native DAC and loader.GetAppDomain() in cDAC. The null-check on the result (returning E_FAIL / throwing) is a sensible defensive guard for the extreme edge case of diagnostics attaching before AppDomain initialization.

Summary: ✅ LGTM. Clean, focused change that correctly eliminates dead parameter usage in GetAppDomainData, GetAssemblyList, and GetAppDomainName across both DAC and cDAC. One minor observation below (non-blocking).


Detailed Findings

Detailed Findings

✅ Correctness — Safe behavioral change

The removal of addr == 0 → E_INVALIDARG checks is correct because addr is now completely unused. The new GetCurrentDomain() == NULL → E_FAIL path is a safer guard — it protects against the (unlikely) scenario of diagnostics attaching before the AppDomain is constructed, rather than checking for a meaningless caller error.

In GetAssemblyList, moving the validation inside SOSDacEnter() / SOSDacLeave() (instead of the old early-return before SOSDacEnter) is actually a consistency improvement, matching the pattern in GetAppDomainData.

✅ DAC/cDAC alignment — Consistent approach

Both native DAC and managed cDAC make the same logical change for all three methods. The cDAC GetAppDomainName already ignored addr (calling loader.GetAppDomainFriendlyName() with no address argument); this PR correctly adds only the documenting comment there.

💡 Minor — HRESULT discrepancy in null-AppDomain error path (non-blocking)

When GetAppDomain() returns null in the cDAC path (GetAppDomainData, GetAssemblyList), the code throws InvalidOperationException, whose default HResult is COR_E_INVALIDOPERATION (0x80131509). The native DAC returns E_FAIL (0x80004005) in the same scenario. The #if DEBUG validation blocks would flag this mismatch if it were ever hit.

This is non-blocking because:

  1. The AppDomain is initialized extremely early — this path is practically unreachable when diagnostics tools are attached.
  2. Both return "failure" to the caller; the specific HRESULT distinction is unlikely to matter.

If you wanted perfect parity, you could use Marshal.ThrowExceptionForHR(HResults.E_FAIL) or a COMException with E_FAIL, but this is strictly optional.

✅ Scope — Appropriately focused

GetFailedAssemblyList (line 2594 in request.cpp) still uses the caller-provided address, which is correctly documented as out-of-scope for this PR.

Note

This review was created by GitHub Copilot.

Generated by Code Review for issue #129476 · ● 16.6M ·

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-diagnostics

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@max-charlamb
max-charlamb marked this pull request as ready for review June 17, 2026 14:26

CopilotAI 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

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@max-charlamb
max-charlamb enabled auto-merge (squash) June 17, 2026 14:48
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g SOSTests passed

@max-charlamb
max-charlamb merged commit 7117272 into mainJun 17, 2026
104 of 140 checks passed
@max-charlamb
max-charlamb deleted the maxcharlamb/ignore-appdomain-addr branch June 17, 2026 16:41
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 18, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!NOTE]
> This PR was created with assistance from GitHub Copilot.
CoreCLR only has a single AppDomain. The `addr`/`domain` parameters
passed to `GetAppDomainData`, `GetAssemblyList`, and `GetAppDomainName`
are historical artifacts from the multi-AppDomain era (.NET Framework).
These methods now use `AppDomain::GetCurrentDomain()` (DAC) or
`ILoader.GetAppDomain()` (cDAC) directly instead of trusting the
caller-provided address.
### Changes
**DAC (`request.cpp`):**
- `GetAppDomainData` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAssemblyList` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAppDomainName` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
**cDAC (`SOSDacImpl.cs`):**
- Same 3 methods use `loader.GetAppDomain()` instead of the input
address
All `addr == 0` precondition checks are removed since the parameter is
no longer used.
### Testing
All cDAC unit tests pass (2509 passed, 0 failed).
### Follow-up from
#129260
Successful runtime-diagnostics run:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 19, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@max-charlamb@steveisok@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Ignore AppDomain address parameters in ISOSDacInterface - #129476

Merged
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr
Jun 17, 2026
Merged

Ignore AppDomain address parameters in ISOSDacInterface#129476
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 16, 2026

Copy link
Copy Markdown
Member

Note

This PR was created with assistance from GitHub Copilot.

CoreCLR only has a single AppDomain. The addr/domain parameters passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName are historical artifacts from the multi-AppDomain era (.NET Framework). These methods now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain() (cDAC) directly instead of trusting the caller-provided address.

Changes

DAC (request.cpp):

  • GetAppDomainData -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAssemblyList -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAppDomainName -- uses AppDomain::GetCurrentDomain() instead of casting addr

cDAC (SOSDacImpl.cs):

  • Same 3 methods use loader.GetAppDomain() instead of the input address

All addr == 0 precondition checks are removed since the parameter is no longer used.

Testing

All cDAC unit tests pass (2509 passed, 0 failed).

Follow-up from

#129260

Successful runtime-diagnostics run: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results

@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.

CopilotAI 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 updates the SOS DAC (ISOSDacInterface) AppDomain-related APIs to stop trusting the caller-provided AppDomain address and instead query the current/default AppDomain directly (native DAC: AppDomain::GetCurrentDomain(), cDAC: ILoader.GetAppDomain()), reflecting CoreCLR’s single-AppDomain model.

Changes:

  • Native DAC (request.cpp): GetAppDomainData, GetAssemblyList, and GetAppDomainName now use AppDomain::GetCurrentDomain() and no longer validate addr != 0.
  • cDAC (SOSDacImpl.cs): the same methods now use loader.GetAppDomain() and no longer validate addr != 0.
  • Removes addr == 0 precondition checks since addr is no longer used.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csSwitches AppDomain-dependent methods to use ILoader.GetAppDomain() instead of the input address.
src/coreclr/debug/daccess/request.cppSwitches AppDomain-dependent methods to use AppDomain::GetCurrentDomain() instead of the input address.

Comment threadsrc/coreclr/debug/daccess/request.cpp Outdated
@github-actions

This comment has been minimized.

CoreCLR only has a single AppDomain. The addr/domain parameters
passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName
are historical artifacts from the multi-AppDomain era. These methods
now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain()
(cDAC) directly instead of trusting the caller-provided address.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@max-charlamb
max-charlambforce-pushed the maxcharlamb/ignore-appdomain-addr branch from 011b745 to da24b3cCompareJune 16, 2026 20:22
@github-actions

Copy link
Copy Markdown
Contributor

Copilot Code Review

Holistic Assessment

Motivation: Well-justified follow-up to #129260. CoreCLR has exactly one AppDomain, so the addr parameter in these three ISOSDacInterface methods was dead weight from the .NET Framework era. Removing its usage eliminates a class of potential bugs where callers could pass stale/wrong addresses.

Approach: Correct and minimal — replaces PTR_AppDomain(TO_TADDR(addr)) with AppDomain::GetCurrentDomain() in native DAC and loader.GetAppDomain() in cDAC. The null-check on the result (returning E_FAIL / throwing) is a sensible defensive guard for the extreme edge case of diagnostics attaching before AppDomain initialization.

Summary: ✅ LGTM. Clean, focused change that correctly eliminates dead parameter usage in GetAppDomainData, GetAssemblyList, and GetAppDomainName across both DAC and cDAC. One minor observation below (non-blocking).


Detailed Findings

Detailed Findings

✅ Correctness — Safe behavioral change

The removal of addr == 0 → E_INVALIDARG checks is correct because addr is now completely unused. The new GetCurrentDomain() == NULL → E_FAIL path is a safer guard — it protects against the (unlikely) scenario of diagnostics attaching before the AppDomain is constructed, rather than checking for a meaningless caller error.

In GetAssemblyList, moving the validation inside SOSDacEnter() / SOSDacLeave() (instead of the old early-return before SOSDacEnter) is actually a consistency improvement, matching the pattern in GetAppDomainData.

✅ DAC/cDAC alignment — Consistent approach

Both native DAC and managed cDAC make the same logical change for all three methods. The cDAC GetAppDomainName already ignored addr (calling loader.GetAppDomainFriendlyName() with no address argument); this PR correctly adds only the documenting comment there.

💡 Minor — HRESULT discrepancy in null-AppDomain error path (non-blocking)

When GetAppDomain() returns null in the cDAC path (GetAppDomainData, GetAssemblyList), the code throws InvalidOperationException, whose default HResult is COR_E_INVALIDOPERATION (0x80131509). The native DAC returns E_FAIL (0x80004005) in the same scenario. The #if DEBUG validation blocks would flag this mismatch if it were ever hit.

This is non-blocking because:

  1. The AppDomain is initialized extremely early — this path is practically unreachable when diagnostics tools are attached.
  2. Both return "failure" to the caller; the specific HRESULT distinction is unlikely to matter.

If you wanted perfect parity, you could use Marshal.ThrowExceptionForHR(HResults.E_FAIL) or a COMException with E_FAIL, but this is strictly optional.

✅ Scope — Appropriately focused

GetFailedAssemblyList (line 2594 in request.cpp) still uses the caller-provided address, which is correctly documented as out-of-scope for this PR.

Note

This review was created by GitHub Copilot.

Generated by Code Review for issue #129476 · ● 16.6M ·

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-diagnostics

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@max-charlamb
max-charlamb marked this pull request as ready for review June 17, 2026 14:26

CopilotAI 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

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@max-charlamb
max-charlamb enabled auto-merge (squash) June 17, 2026 14:48
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g SOSTests passed

@max-charlamb
max-charlamb merged commit 7117272 into mainJun 17, 2026
104 of 140 checks passed
@max-charlamb
max-charlamb deleted the maxcharlamb/ignore-appdomain-addr branch June 17, 2026 16:41
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 18, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!NOTE]
> This PR was created with assistance from GitHub Copilot.
CoreCLR only has a single AppDomain. The `addr`/`domain` parameters
passed to `GetAppDomainData`, `GetAssemblyList`, and `GetAppDomainName`
are historical artifacts from the multi-AppDomain era (.NET Framework).
These methods now use `AppDomain::GetCurrentDomain()` (DAC) or
`ILoader.GetAppDomain()` (cDAC) directly instead of trusting the
caller-provided address.
### Changes
**DAC (`request.cpp`):**
- `GetAppDomainData` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAssemblyList` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAppDomainName` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
**cDAC (`SOSDacImpl.cs`):**
- Same 3 methods use `loader.GetAppDomain()` instead of the input
address
All `addr == 0` precondition checks are removed since the parameter is
no longer used.
### Testing
All cDAC unit tests pass (2509 passed, 0 failed).
### Follow-up from
#129260
Successful runtime-diagnostics run:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 19, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@max-charlamb@steveisok@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Ignore AppDomain address parameters in ISOSDacInterface - #129476

Merged
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr
Jun 17, 2026
Merged

Ignore AppDomain address parameters in ISOSDacInterface#129476
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 16, 2026

Copy link
Copy Markdown
Member

Note

This PR was created with assistance from GitHub Copilot.

CoreCLR only has a single AppDomain. The addr/domain parameters passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName are historical artifacts from the multi-AppDomain era (.NET Framework). These methods now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain() (cDAC) directly instead of trusting the caller-provided address.

Changes

DAC (request.cpp):

  • GetAppDomainData -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAssemblyList -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAppDomainName -- uses AppDomain::GetCurrentDomain() instead of casting addr

cDAC (SOSDacImpl.cs):

  • Same 3 methods use loader.GetAppDomain() instead of the input address

All addr == 0 precondition checks are removed since the parameter is no longer used.

Testing

All cDAC unit tests pass (2509 passed, 0 failed).

Follow-up from

#129260

Successful runtime-diagnostics run: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results

@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.

CopilotAI 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 updates the SOS DAC (ISOSDacInterface) AppDomain-related APIs to stop trusting the caller-provided AppDomain address and instead query the current/default AppDomain directly (native DAC: AppDomain::GetCurrentDomain(), cDAC: ILoader.GetAppDomain()), reflecting CoreCLR’s single-AppDomain model.

Changes:

  • Native DAC (request.cpp): GetAppDomainData, GetAssemblyList, and GetAppDomainName now use AppDomain::GetCurrentDomain() and no longer validate addr != 0.
  • cDAC (SOSDacImpl.cs): the same methods now use loader.GetAppDomain() and no longer validate addr != 0.
  • Removes addr == 0 precondition checks since addr is no longer used.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csSwitches AppDomain-dependent methods to use ILoader.GetAppDomain() instead of the input address.
src/coreclr/debug/daccess/request.cppSwitches AppDomain-dependent methods to use AppDomain::GetCurrentDomain() instead of the input address.

Comment threadsrc/coreclr/debug/daccess/request.cpp Outdated
@github-actions

This comment has been minimized.

CoreCLR only has a single AppDomain. The addr/domain parameters
passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName
are historical artifacts from the multi-AppDomain era. These methods
now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain()
(cDAC) directly instead of trusting the caller-provided address.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@max-charlamb
max-charlambforce-pushed the maxcharlamb/ignore-appdomain-addr branch from 011b745 to da24b3cCompareJune 16, 2026 20:22
@github-actions

Copy link
Copy Markdown
Contributor

Copilot Code Review

Holistic Assessment

Motivation: Well-justified follow-up to #129260. CoreCLR has exactly one AppDomain, so the addr parameter in these three ISOSDacInterface methods was dead weight from the .NET Framework era. Removing its usage eliminates a class of potential bugs where callers could pass stale/wrong addresses.

Approach: Correct and minimal — replaces PTR_AppDomain(TO_TADDR(addr)) with AppDomain::GetCurrentDomain() in native DAC and loader.GetAppDomain() in cDAC. The null-check on the result (returning E_FAIL / throwing) is a sensible defensive guard for the extreme edge case of diagnostics attaching before AppDomain initialization.

Summary: ✅ LGTM. Clean, focused change that correctly eliminates dead parameter usage in GetAppDomainData, GetAssemblyList, and GetAppDomainName across both DAC and cDAC. One minor observation below (non-blocking).


Detailed Findings

Detailed Findings

✅ Correctness — Safe behavioral change

The removal of addr == 0 → E_INVALIDARG checks is correct because addr is now completely unused. The new GetCurrentDomain() == NULL → E_FAIL path is a safer guard — it protects against the (unlikely) scenario of diagnostics attaching before the AppDomain is constructed, rather than checking for a meaningless caller error.

In GetAssemblyList, moving the validation inside SOSDacEnter() / SOSDacLeave() (instead of the old early-return before SOSDacEnter) is actually a consistency improvement, matching the pattern in GetAppDomainData.

✅ DAC/cDAC alignment — Consistent approach

Both native DAC and managed cDAC make the same logical change for all three methods. The cDAC GetAppDomainName already ignored addr (calling loader.GetAppDomainFriendlyName() with no address argument); this PR correctly adds only the documenting comment there.

💡 Minor — HRESULT discrepancy in null-AppDomain error path (non-blocking)

When GetAppDomain() returns null in the cDAC path (GetAppDomainData, GetAssemblyList), the code throws InvalidOperationException, whose default HResult is COR_E_INVALIDOPERATION (0x80131509). The native DAC returns E_FAIL (0x80004005) in the same scenario. The #if DEBUG validation blocks would flag this mismatch if it were ever hit.

This is non-blocking because:

  1. The AppDomain is initialized extremely early — this path is practically unreachable when diagnostics tools are attached.
  2. Both return "failure" to the caller; the specific HRESULT distinction is unlikely to matter.

If you wanted perfect parity, you could use Marshal.ThrowExceptionForHR(HResults.E_FAIL) or a COMException with E_FAIL, but this is strictly optional.

✅ Scope — Appropriately focused

GetFailedAssemblyList (line 2594 in request.cpp) still uses the caller-provided address, which is correctly documented as out-of-scope for this PR.

Note

This review was created by GitHub Copilot.

Generated by Code Review for issue #129476 · ● 16.6M ·

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-diagnostics

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@max-charlamb
max-charlamb marked this pull request as ready for review June 17, 2026 14:26

CopilotAI 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

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@max-charlamb
max-charlamb enabled auto-merge (squash) June 17, 2026 14:48
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g SOSTests passed

@max-charlamb
max-charlamb merged commit 7117272 into mainJun 17, 2026
104 of 140 checks passed
@max-charlamb
max-charlamb deleted the maxcharlamb/ignore-appdomain-addr branch June 17, 2026 16:41
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 18, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!NOTE]
> This PR was created with assistance from GitHub Copilot.
CoreCLR only has a single AppDomain. The `addr`/`domain` parameters
passed to `GetAppDomainData`, `GetAssemblyList`, and `GetAppDomainName`
are historical artifacts from the multi-AppDomain era (.NET Framework).
These methods now use `AppDomain::GetCurrentDomain()` (DAC) or
`ILoader.GetAppDomain()` (cDAC) directly instead of trusting the
caller-provided address.
### Changes
**DAC (`request.cpp`):**
- `GetAppDomainData` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAssemblyList` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAppDomainName` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
**cDAC (`SOSDacImpl.cs`):**
- Same 3 methods use `loader.GetAppDomain()` instead of the input
address
All `addr == 0` precondition checks are removed since the parameter is
no longer used.
### Testing
All cDAC unit tests pass (2509 passed, 0 failed).
### Follow-up from
#129260
Successful runtime-diagnostics run:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 19, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@max-charlamb@steveisok@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Ignore AppDomain address parameters in ISOSDacInterface - #129476

Merged
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr
Jun 17, 2026
Merged

Ignore AppDomain address parameters in ISOSDacInterface#129476
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 16, 2026

Copy link
Copy Markdown
Member

Note

This PR was created with assistance from GitHub Copilot.

CoreCLR only has a single AppDomain. The addr/domain parameters passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName are historical artifacts from the multi-AppDomain era (.NET Framework). These methods now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain() (cDAC) directly instead of trusting the caller-provided address.

Changes

DAC (request.cpp):

  • GetAppDomainData -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAssemblyList -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAppDomainName -- uses AppDomain::GetCurrentDomain() instead of casting addr

cDAC (SOSDacImpl.cs):

  • Same 3 methods use loader.GetAppDomain() instead of the input address

All addr == 0 precondition checks are removed since the parameter is no longer used.

Testing

All cDAC unit tests pass (2509 passed, 0 failed).

Follow-up from

#129260

Successful runtime-diagnostics run: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results

@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.

CopilotAI 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 updates the SOS DAC (ISOSDacInterface) AppDomain-related APIs to stop trusting the caller-provided AppDomain address and instead query the current/default AppDomain directly (native DAC: AppDomain::GetCurrentDomain(), cDAC: ILoader.GetAppDomain()), reflecting CoreCLR’s single-AppDomain model.

Changes:

  • Native DAC (request.cpp): GetAppDomainData, GetAssemblyList, and GetAppDomainName now use AppDomain::GetCurrentDomain() and no longer validate addr != 0.
  • cDAC (SOSDacImpl.cs): the same methods now use loader.GetAppDomain() and no longer validate addr != 0.
  • Removes addr == 0 precondition checks since addr is no longer used.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csSwitches AppDomain-dependent methods to use ILoader.GetAppDomain() instead of the input address.
src/coreclr/debug/daccess/request.cppSwitches AppDomain-dependent methods to use AppDomain::GetCurrentDomain() instead of the input address.

Comment threadsrc/coreclr/debug/daccess/request.cpp Outdated
@github-actions

This comment has been minimized.

CoreCLR only has a single AppDomain. The addr/domain parameters
passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName
are historical artifacts from the multi-AppDomain era. These methods
now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain()
(cDAC) directly instead of trusting the caller-provided address.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@max-charlamb
max-charlambforce-pushed the maxcharlamb/ignore-appdomain-addr branch from 011b745 to da24b3cCompareJune 16, 2026 20:22
@github-actions

Copy link
Copy Markdown
Contributor

Copilot Code Review

Holistic Assessment

Motivation: Well-justified follow-up to #129260. CoreCLR has exactly one AppDomain, so the addr parameter in these three ISOSDacInterface methods was dead weight from the .NET Framework era. Removing its usage eliminates a class of potential bugs where callers could pass stale/wrong addresses.

Approach: Correct and minimal — replaces PTR_AppDomain(TO_TADDR(addr)) with AppDomain::GetCurrentDomain() in native DAC and loader.GetAppDomain() in cDAC. The null-check on the result (returning E_FAIL / throwing) is a sensible defensive guard for the extreme edge case of diagnostics attaching before AppDomain initialization.

Summary: ✅ LGTM. Clean, focused change that correctly eliminates dead parameter usage in GetAppDomainData, GetAssemblyList, and GetAppDomainName across both DAC and cDAC. One minor observation below (non-blocking).


Detailed Findings

Detailed Findings

✅ Correctness — Safe behavioral change

The removal of addr == 0 → E_INVALIDARG checks is correct because addr is now completely unused. The new GetCurrentDomain() == NULL → E_FAIL path is a safer guard — it protects against the (unlikely) scenario of diagnostics attaching before the AppDomain is constructed, rather than checking for a meaningless caller error.

In GetAssemblyList, moving the validation inside SOSDacEnter() / SOSDacLeave() (instead of the old early-return before SOSDacEnter) is actually a consistency improvement, matching the pattern in GetAppDomainData.

✅ DAC/cDAC alignment — Consistent approach

Both native DAC and managed cDAC make the same logical change for all three methods. The cDAC GetAppDomainName already ignored addr (calling loader.GetAppDomainFriendlyName() with no address argument); this PR correctly adds only the documenting comment there.

💡 Minor — HRESULT discrepancy in null-AppDomain error path (non-blocking)

When GetAppDomain() returns null in the cDAC path (GetAppDomainData, GetAssemblyList), the code throws InvalidOperationException, whose default HResult is COR_E_INVALIDOPERATION (0x80131509). The native DAC returns E_FAIL (0x80004005) in the same scenario. The #if DEBUG validation blocks would flag this mismatch if it were ever hit.

This is non-blocking because:

  1. The AppDomain is initialized extremely early — this path is practically unreachable when diagnostics tools are attached.
  2. Both return "failure" to the caller; the specific HRESULT distinction is unlikely to matter.

If you wanted perfect parity, you could use Marshal.ThrowExceptionForHR(HResults.E_FAIL) or a COMException with E_FAIL, but this is strictly optional.

✅ Scope — Appropriately focused

GetFailedAssemblyList (line 2594 in request.cpp) still uses the caller-provided address, which is correctly documented as out-of-scope for this PR.

Note

This review was created by GitHub Copilot.

Generated by Code Review for issue #129476 · ● 16.6M ·

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-diagnostics

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@max-charlamb
max-charlamb marked this pull request as ready for review June 17, 2026 14:26

CopilotAI 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

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@max-charlamb
max-charlamb enabled auto-merge (squash) June 17, 2026 14:48
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g SOSTests passed

@max-charlamb
max-charlamb merged commit 7117272 into mainJun 17, 2026
104 of 140 checks passed
@max-charlamb
max-charlamb deleted the maxcharlamb/ignore-appdomain-addr branch June 17, 2026 16:41
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 18, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!NOTE]
> This PR was created with assistance from GitHub Copilot.
CoreCLR only has a single AppDomain. The `addr`/`domain` parameters
passed to `GetAppDomainData`, `GetAssemblyList`, and `GetAppDomainName`
are historical artifacts from the multi-AppDomain era (.NET Framework).
These methods now use `AppDomain::GetCurrentDomain()` (DAC) or
`ILoader.GetAppDomain()` (cDAC) directly instead of trusting the
caller-provided address.
### Changes
**DAC (`request.cpp`):**
- `GetAppDomainData` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAssemblyList` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAppDomainName` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
**cDAC (`SOSDacImpl.cs`):**
- Same 3 methods use `loader.GetAppDomain()` instead of the input
address
All `addr == 0` precondition checks are removed since the parameter is
no longer used.
### Testing
All cDAC unit tests pass (2509 passed, 0 failed).
### Follow-up from
#129260
Successful runtime-diagnostics run:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 19, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@max-charlamb@steveisok@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Ignore AppDomain address parameters in ISOSDacInterface - #129476

Merged
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr
Jun 17, 2026
Merged

Ignore AppDomain address parameters in ISOSDacInterface#129476
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 16, 2026

Copy link
Copy Markdown
Member

Note

This PR was created with assistance from GitHub Copilot.

CoreCLR only has a single AppDomain. The addr/domain parameters passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName are historical artifacts from the multi-AppDomain era (.NET Framework). These methods now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain() (cDAC) directly instead of trusting the caller-provided address.

Changes

DAC (request.cpp):

  • GetAppDomainData -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAssemblyList -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAppDomainName -- uses AppDomain::GetCurrentDomain() instead of casting addr

cDAC (SOSDacImpl.cs):

  • Same 3 methods use loader.GetAppDomain() instead of the input address

All addr == 0 precondition checks are removed since the parameter is no longer used.

Testing

All cDAC unit tests pass (2509 passed, 0 failed).

Follow-up from

#129260

Successful runtime-diagnostics run: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results

@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.

CopilotAI 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 updates the SOS DAC (ISOSDacInterface) AppDomain-related APIs to stop trusting the caller-provided AppDomain address and instead query the current/default AppDomain directly (native DAC: AppDomain::GetCurrentDomain(), cDAC: ILoader.GetAppDomain()), reflecting CoreCLR’s single-AppDomain model.

Changes:

  • Native DAC (request.cpp): GetAppDomainData, GetAssemblyList, and GetAppDomainName now use AppDomain::GetCurrentDomain() and no longer validate addr != 0.
  • cDAC (SOSDacImpl.cs): the same methods now use loader.GetAppDomain() and no longer validate addr != 0.
  • Removes addr == 0 precondition checks since addr is no longer used.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csSwitches AppDomain-dependent methods to use ILoader.GetAppDomain() instead of the input address.
src/coreclr/debug/daccess/request.cppSwitches AppDomain-dependent methods to use AppDomain::GetCurrentDomain() instead of the input address.

Comment threadsrc/coreclr/debug/daccess/request.cpp Outdated
@github-actions

This comment has been minimized.

CoreCLR only has a single AppDomain. The addr/domain parameters
passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName
are historical artifacts from the multi-AppDomain era. These methods
now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain()
(cDAC) directly instead of trusting the caller-provided address.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@max-charlamb
max-charlambforce-pushed the maxcharlamb/ignore-appdomain-addr branch from 011b745 to da24b3cCompareJune 16, 2026 20:22
@github-actions

Copy link
Copy Markdown
Contributor

Copilot Code Review

Holistic Assessment

Motivation: Well-justified follow-up to #129260. CoreCLR has exactly one AppDomain, so the addr parameter in these three ISOSDacInterface methods was dead weight from the .NET Framework era. Removing its usage eliminates a class of potential bugs where callers could pass stale/wrong addresses.

Approach: Correct and minimal — replaces PTR_AppDomain(TO_TADDR(addr)) with AppDomain::GetCurrentDomain() in native DAC and loader.GetAppDomain() in cDAC. The null-check on the result (returning E_FAIL / throwing) is a sensible defensive guard for the extreme edge case of diagnostics attaching before AppDomain initialization.

Summary: ✅ LGTM. Clean, focused change that correctly eliminates dead parameter usage in GetAppDomainData, GetAssemblyList, and GetAppDomainName across both DAC and cDAC. One minor observation below (non-blocking).


Detailed Findings

Detailed Findings

✅ Correctness — Safe behavioral change

The removal of addr == 0 → E_INVALIDARG checks is correct because addr is now completely unused. The new GetCurrentDomain() == NULL → E_FAIL path is a safer guard — it protects against the (unlikely) scenario of diagnostics attaching before the AppDomain is constructed, rather than checking for a meaningless caller error.

In GetAssemblyList, moving the validation inside SOSDacEnter() / SOSDacLeave() (instead of the old early-return before SOSDacEnter) is actually a consistency improvement, matching the pattern in GetAppDomainData.

✅ DAC/cDAC alignment — Consistent approach

Both native DAC and managed cDAC make the same logical change for all three methods. The cDAC GetAppDomainName already ignored addr (calling loader.GetAppDomainFriendlyName() with no address argument); this PR correctly adds only the documenting comment there.

💡 Minor — HRESULT discrepancy in null-AppDomain error path (non-blocking)

When GetAppDomain() returns null in the cDAC path (GetAppDomainData, GetAssemblyList), the code throws InvalidOperationException, whose default HResult is COR_E_INVALIDOPERATION (0x80131509). The native DAC returns E_FAIL (0x80004005) in the same scenario. The #if DEBUG validation blocks would flag this mismatch if it were ever hit.

This is non-blocking because:

  1. The AppDomain is initialized extremely early — this path is practically unreachable when diagnostics tools are attached.
  2. Both return "failure" to the caller; the specific HRESULT distinction is unlikely to matter.

If you wanted perfect parity, you could use Marshal.ThrowExceptionForHR(HResults.E_FAIL) or a COMException with E_FAIL, but this is strictly optional.

✅ Scope — Appropriately focused

GetFailedAssemblyList (line 2594 in request.cpp) still uses the caller-provided address, which is correctly documented as out-of-scope for this PR.

Note

This review was created by GitHub Copilot.

Generated by Code Review for issue #129476 · ● 16.6M ·

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-diagnostics

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@max-charlamb
max-charlamb marked this pull request as ready for review June 17, 2026 14:26

CopilotAI 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

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@max-charlamb
max-charlamb enabled auto-merge (squash) June 17, 2026 14:48
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g SOSTests passed

@max-charlamb
max-charlamb merged commit 7117272 into mainJun 17, 2026
104 of 140 checks passed
@max-charlamb
max-charlamb deleted the maxcharlamb/ignore-appdomain-addr branch June 17, 2026 16:41
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 18, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!NOTE]
> This PR was created with assistance from GitHub Copilot.
CoreCLR only has a single AppDomain. The `addr`/`domain` parameters
passed to `GetAppDomainData`, `GetAssemblyList`, and `GetAppDomainName`
are historical artifacts from the multi-AppDomain era (.NET Framework).
These methods now use `AppDomain::GetCurrentDomain()` (DAC) or
`ILoader.GetAppDomain()` (cDAC) directly instead of trusting the
caller-provided address.
### Changes
**DAC (`request.cpp`):**
- `GetAppDomainData` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAssemblyList` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAppDomainName` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
**cDAC (`SOSDacImpl.cs`):**
- Same 3 methods use `loader.GetAppDomain()` instead of the input
address
All `addr == 0` precondition checks are removed since the parameter is
no longer used.
### Testing
All cDAC unit tests pass (2509 passed, 0 failed).
### Follow-up from
#129260
Successful runtime-diagnostics run:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 19, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@max-charlamb@steveisok@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Ignore AppDomain address parameters in ISOSDacInterface - #129476

Merged
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr
Jun 17, 2026
Merged

Ignore AppDomain address parameters in ISOSDacInterface#129476
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 16, 2026

Copy link
Copy Markdown
Member

Note

This PR was created with assistance from GitHub Copilot.

CoreCLR only has a single AppDomain. The addr/domain parameters passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName are historical artifacts from the multi-AppDomain era (.NET Framework). These methods now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain() (cDAC) directly instead of trusting the caller-provided address.

Changes

DAC (request.cpp):

  • GetAppDomainData -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAssemblyList -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAppDomainName -- uses AppDomain::GetCurrentDomain() instead of casting addr

cDAC (SOSDacImpl.cs):

  • Same 3 methods use loader.GetAppDomain() instead of the input address

All addr == 0 precondition checks are removed since the parameter is no longer used.

Testing

All cDAC unit tests pass (2509 passed, 0 failed).

Follow-up from

#129260

Successful runtime-diagnostics run: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results

@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.

CopilotAI 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 updates the SOS DAC (ISOSDacInterface) AppDomain-related APIs to stop trusting the caller-provided AppDomain address and instead query the current/default AppDomain directly (native DAC: AppDomain::GetCurrentDomain(), cDAC: ILoader.GetAppDomain()), reflecting CoreCLR’s single-AppDomain model.

Changes:

  • Native DAC (request.cpp): GetAppDomainData, GetAssemblyList, and GetAppDomainName now use AppDomain::GetCurrentDomain() and no longer validate addr != 0.
  • cDAC (SOSDacImpl.cs): the same methods now use loader.GetAppDomain() and no longer validate addr != 0.
  • Removes addr == 0 precondition checks since addr is no longer used.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csSwitches AppDomain-dependent methods to use ILoader.GetAppDomain() instead of the input address.
src/coreclr/debug/daccess/request.cppSwitches AppDomain-dependent methods to use AppDomain::GetCurrentDomain() instead of the input address.

Comment threadsrc/coreclr/debug/daccess/request.cpp Outdated
@github-actions

This comment has been minimized.

CoreCLR only has a single AppDomain. The addr/domain parameters
passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName
are historical artifacts from the multi-AppDomain era. These methods
now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain()
(cDAC) directly instead of trusting the caller-provided address.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@max-charlamb
max-charlambforce-pushed the maxcharlamb/ignore-appdomain-addr branch from 011b745 to da24b3cCompareJune 16, 2026 20:22
@github-actions

Copy link
Copy Markdown
Contributor

Copilot Code Review

Holistic Assessment

Motivation: Well-justified follow-up to #129260. CoreCLR has exactly one AppDomain, so the addr parameter in these three ISOSDacInterface methods was dead weight from the .NET Framework era. Removing its usage eliminates a class of potential bugs where callers could pass stale/wrong addresses.

Approach: Correct and minimal — replaces PTR_AppDomain(TO_TADDR(addr)) with AppDomain::GetCurrentDomain() in native DAC and loader.GetAppDomain() in cDAC. The null-check on the result (returning E_FAIL / throwing) is a sensible defensive guard for the extreme edge case of diagnostics attaching before AppDomain initialization.

Summary: ✅ LGTM. Clean, focused change that correctly eliminates dead parameter usage in GetAppDomainData, GetAssemblyList, and GetAppDomainName across both DAC and cDAC. One minor observation below (non-blocking).


Detailed Findings

Detailed Findings

✅ Correctness — Safe behavioral change

The removal of addr == 0 → E_INVALIDARG checks is correct because addr is now completely unused. The new GetCurrentDomain() == NULL → E_FAIL path is a safer guard — it protects against the (unlikely) scenario of diagnostics attaching before the AppDomain is constructed, rather than checking for a meaningless caller error.

In GetAssemblyList, moving the validation inside SOSDacEnter() / SOSDacLeave() (instead of the old early-return before SOSDacEnter) is actually a consistency improvement, matching the pattern in GetAppDomainData.

✅ DAC/cDAC alignment — Consistent approach

Both native DAC and managed cDAC make the same logical change for all three methods. The cDAC GetAppDomainName already ignored addr (calling loader.GetAppDomainFriendlyName() with no address argument); this PR correctly adds only the documenting comment there.

💡 Minor — HRESULT discrepancy in null-AppDomain error path (non-blocking)

When GetAppDomain() returns null in the cDAC path (GetAppDomainData, GetAssemblyList), the code throws InvalidOperationException, whose default HResult is COR_E_INVALIDOPERATION (0x80131509). The native DAC returns E_FAIL (0x80004005) in the same scenario. The #if DEBUG validation blocks would flag this mismatch if it were ever hit.

This is non-blocking because:

  1. The AppDomain is initialized extremely early — this path is practically unreachable when diagnostics tools are attached.
  2. Both return "failure" to the caller; the specific HRESULT distinction is unlikely to matter.

If you wanted perfect parity, you could use Marshal.ThrowExceptionForHR(HResults.E_FAIL) or a COMException with E_FAIL, but this is strictly optional.

✅ Scope — Appropriately focused

GetFailedAssemblyList (line 2594 in request.cpp) still uses the caller-provided address, which is correctly documented as out-of-scope for this PR.

Note

This review was created by GitHub Copilot.

Generated by Code Review for issue #129476 · ● 16.6M ·

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-diagnostics

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@max-charlamb
max-charlamb marked this pull request as ready for review June 17, 2026 14:26

CopilotAI 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

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@max-charlamb
max-charlamb enabled auto-merge (squash) June 17, 2026 14:48
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g SOSTests passed

@max-charlamb
max-charlamb merged commit 7117272 into mainJun 17, 2026
104 of 140 checks passed
@max-charlamb
max-charlamb deleted the maxcharlamb/ignore-appdomain-addr branch June 17, 2026 16:41
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 18, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!NOTE]
> This PR was created with assistance from GitHub Copilot.
CoreCLR only has a single AppDomain. The `addr`/`domain` parameters
passed to `GetAppDomainData`, `GetAssemblyList`, and `GetAppDomainName`
are historical artifacts from the multi-AppDomain era (.NET Framework).
These methods now use `AppDomain::GetCurrentDomain()` (DAC) or
`ILoader.GetAppDomain()` (cDAC) directly instead of trusting the
caller-provided address.
### Changes
**DAC (`request.cpp`):**
- `GetAppDomainData` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAssemblyList` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAppDomainName` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
**cDAC (`SOSDacImpl.cs`):**
- Same 3 methods use `loader.GetAppDomain()` instead of the input
address
All `addr == 0` precondition checks are removed since the parameter is
no longer used.
### Testing
All cDAC unit tests pass (2509 passed, 0 failed).
### Follow-up from
#129260
Successful runtime-diagnostics run:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 19, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@max-charlamb@steveisok@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Ignore AppDomain address parameters in ISOSDacInterface - #129476

Merged
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr
Jun 17, 2026
Merged

Ignore AppDomain address parameters in ISOSDacInterface#129476
max-charlamb merged 1 commit into
mainfrom
maxcharlamb/ignore-appdomain-addr

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 16, 2026

Copy link
Copy Markdown
Member

Note

This PR was created with assistance from GitHub Copilot.

CoreCLR only has a single AppDomain. The addr/domain parameters passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName are historical artifacts from the multi-AppDomain era (.NET Framework). These methods now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain() (cDAC) directly instead of trusting the caller-provided address.

Changes

DAC (request.cpp):

  • GetAppDomainData -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAssemblyList -- uses AppDomain::GetCurrentDomain() instead of casting addr
  • GetAppDomainName -- uses AppDomain::GetCurrentDomain() instead of casting addr

cDAC (SOSDacImpl.cs):

  • Same 3 methods use loader.GetAppDomain() instead of the input address

All addr == 0 precondition checks are removed since the parameter is no longer used.

Testing

All cDAC unit tests pass (2509 passed, 0 failed).

Follow-up from

#129260

Successful runtime-diagnostics run: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results

@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.

CopilotAI 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 updates the SOS DAC (ISOSDacInterface) AppDomain-related APIs to stop trusting the caller-provided AppDomain address and instead query the current/default AppDomain directly (native DAC: AppDomain::GetCurrentDomain(), cDAC: ILoader.GetAppDomain()), reflecting CoreCLR’s single-AppDomain model.

Changes:

  • Native DAC (request.cpp): GetAppDomainData, GetAssemblyList, and GetAppDomainName now use AppDomain::GetCurrentDomain() and no longer validate addr != 0.
  • cDAC (SOSDacImpl.cs): the same methods now use loader.GetAppDomain() and no longer validate addr != 0.
  • Removes addr == 0 precondition checks since addr is no longer used.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csSwitches AppDomain-dependent methods to use ILoader.GetAppDomain() instead of the input address.
src/coreclr/debug/daccess/request.cppSwitches AppDomain-dependent methods to use AppDomain::GetCurrentDomain() instead of the input address.

Comment threadsrc/coreclr/debug/daccess/request.cpp Outdated
@github-actions

This comment has been minimized.

CoreCLR only has a single AppDomain. The addr/domain parameters
passed to GetAppDomainData, GetAssemblyList, and GetAppDomainName
are historical artifacts from the multi-AppDomain era. These methods
now use AppDomain::GetCurrentDomain() (DAC) or ILoader.GetAppDomain()
(cDAC) directly instead of trusting the caller-provided address.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@max-charlamb
max-charlambforce-pushed the maxcharlamb/ignore-appdomain-addr branch from 011b745 to da24b3cCompareJune 16, 2026 20:22
@github-actions

Copy link
Copy Markdown
Contributor

Copilot Code Review

Holistic Assessment

Motivation: Well-justified follow-up to #129260. CoreCLR has exactly one AppDomain, so the addr parameter in these three ISOSDacInterface methods was dead weight from the .NET Framework era. Removing its usage eliminates a class of potential bugs where callers could pass stale/wrong addresses.

Approach: Correct and minimal — replaces PTR_AppDomain(TO_TADDR(addr)) with AppDomain::GetCurrentDomain() in native DAC and loader.GetAppDomain() in cDAC. The null-check on the result (returning E_FAIL / throwing) is a sensible defensive guard for the extreme edge case of diagnostics attaching before AppDomain initialization.

Summary: ✅ LGTM. Clean, focused change that correctly eliminates dead parameter usage in GetAppDomainData, GetAssemblyList, and GetAppDomainName across both DAC and cDAC. One minor observation below (non-blocking).


Detailed Findings

Detailed Findings

✅ Correctness — Safe behavioral change

The removal of addr == 0 → E_INVALIDARG checks is correct because addr is now completely unused. The new GetCurrentDomain() == NULL → E_FAIL path is a safer guard — it protects against the (unlikely) scenario of diagnostics attaching before the AppDomain is constructed, rather than checking for a meaningless caller error.

In GetAssemblyList, moving the validation inside SOSDacEnter() / SOSDacLeave() (instead of the old early-return before SOSDacEnter) is actually a consistency improvement, matching the pattern in GetAppDomainData.

✅ DAC/cDAC alignment — Consistent approach

Both native DAC and managed cDAC make the same logical change for all three methods. The cDAC GetAppDomainName already ignored addr (calling loader.GetAppDomainFriendlyName() with no address argument); this PR correctly adds only the documenting comment there.

💡 Minor — HRESULT discrepancy in null-AppDomain error path (non-blocking)

When GetAppDomain() returns null in the cDAC path (GetAppDomainData, GetAssemblyList), the code throws InvalidOperationException, whose default HResult is COR_E_INVALIDOPERATION (0x80131509). The native DAC returns E_FAIL (0x80004005) in the same scenario. The #if DEBUG validation blocks would flag this mismatch if it were ever hit.

This is non-blocking because:

  1. The AppDomain is initialized extremely early — this path is practically unreachable when diagnostics tools are attached.
  2. Both return "failure" to the caller; the specific HRESULT distinction is unlikely to matter.

If you wanted perfect parity, you could use Marshal.ThrowExceptionForHR(HResults.E_FAIL) or a COMException with E_FAIL, but this is strictly optional.

✅ Scope — Appropriately focused

GetFailedAssemblyList (line 2594 in request.cpp) still uses the caller-provided address, which is correctly documented as out-of-scope for this PR.

Note

This review was created by GitHub Copilot.

Generated by Code Review for issue #129476 · ● 16.6M ·

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-diagnostics

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@max-charlamb
max-charlamb marked this pull request as ready for review June 17, 2026 14:26

CopilotAI 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

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@max-charlamb
max-charlamb enabled auto-merge (squash) June 17, 2026 14:48
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g SOSTests passed

@max-charlamb
max-charlamb merged commit 7117272 into mainJun 17, 2026
104 of 140 checks passed
@max-charlamb
max-charlamb deleted the maxcharlamb/ignore-appdomain-addr branch June 17, 2026 16:41
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 18, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!NOTE]
> This PR was created with assistance from GitHub Copilot.
CoreCLR only has a single AppDomain. The `addr`/`domain` parameters
passed to `GetAppDomainData`, `GetAssemblyList`, and `GetAppDomainName`
are historical artifacts from the multi-AppDomain era (.NET Framework).
These methods now use `AppDomain::GetCurrentDomain()` (DAC) or
`ILoader.GetAppDomain()` (cDAC) directly instead of trusting the
caller-provided address.
### Changes
**DAC (`request.cpp`):**
- `GetAppDomainData` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAssemblyList` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
- `GetAppDomainName` -- uses `AppDomain::GetCurrentDomain()` instead of
casting `addr`
**cDAC (`SOSDacImpl.cs`):**
- Same 3 methods use `loader.GetAppDomain()` instead of the input
address
All `addr == 0` precondition checks are removed since the parameter is
no longer used.
### Testing
All cDAC unit tests pass (2509 passed, 0 failed).
### Follow-up from
#129260
Successful runtime-diagnostics run:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1467096&view=results
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 19, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@max-charlamb@steveisok@jkotas