Skip to content

cDAC stress build break: match GetObjectStringData's quirky dac behavior - #129297

Merged
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg
Jun 11, 2026
Merged

cDAC stress build break: match GetObjectStringData's quirky dac behavior#129297
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg

Conversation

@leculver

@leculverleculver commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG when called on a valid string with no output buffer (stringData == null or count == 0), while still populating *pNeeded. The cDAC implementation returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception string. Mirror the cDac: fix the weird behavior that we don't depend on in the legacy dac, and assert similar data here.

This fixes the build/test-break in the cDac introduced by dotnet/diagnostics#5865.

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

@leculverleculver changed the title cDAC: GetObjectStringData returns E_INVALIDARG for length-only queriescDAC stress build break: match GetObjectStringData's quirky dac behaviorJun 11, 2026

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

Updates the legacy cDAC ISOSDacInterface.GetObjectStringData implementation to better match the legacy DAC’s HRESULT behavior for length-only string queries by returning E_INVALIDARG while still reporting the required buffer length.

Changes:

  • After copying/string-length computation via OutputBufferHelpers.CopyStringToBuffer, return E_INVALIDARG when there is no output buffer (stringData == null || count == 0).
  • Add an explanatory comment documenting the legacy DAC parity intent.
Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csAdjusts GetObjectStringData HRESULT for length-only queries to align with legacy DAC behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when no output buffer is available (count == 0) even on a valid string,
while still populating *pNeeded. The cDAC implementation returned S_OK,
which trips the cDAC-vs-DAC HResult parity assert when CLRMA (clrma under
dotnet-dump) sizes an exception string via GetObjectStringData(obj, 0,
nullptr, &needed).
Mirror the DAC: validate args as it does (so a non-null buffer with
count == 0 still reports the needed size), populate *pNeeded via
CopyStringToBuffer, then return E_INVALIDARG when count == 0. CLRMA
explicitly ignores that HRESULT and uses the reported size.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculverforce-pushed the cdac-getobjectstringdata-invalidarg branch from 5de372f to 629af16CompareJune 11, 2026 16:26
CopilotAI review requested due to automatic review settings June 11, 2026 16:47

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.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Invoke the legacy DAC with the same stringData/pNeeded nullness the caller
passed to the cDAC, so the debug HRESULT comparison is apples-to-apples and
can't manufacture a spurious divergence from substituted arguments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculver enabled auto-merge (squash) June 11, 2026 17:30
…ng it
Rather than tolerating the divergence via AllowCdacSuccess, fix the legacy
DAC: ClrDataAccess::GetObjectStringData no longer returns E_INVALIDARG for a
size-only query (no output buffer) on a valid string -- it reports the needed
size via *pNeeded and succeeds, matching the cDAC. The cDAC debug parity
check returns to the default validation mode.
Also mirror the caller's stringData/pNeeded nullness into the legacy DAC call
in the debug validation, and derive the content-compare length from the cDAC
string (neededLocal is only populated when a size-out is requested), avoiding
an out-of-range span when pNeeded is null.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 18:35

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.

Copilot's findings

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

Comment threadsrc/coreclr/debug/daccess/request.cpp
@leculver
leculver merged commit c8f7ed2 into dotnet:mainJun 11, 2026
128 of 130 checks passed
@leculver
leculver deleted the cdac-getobjectstringdata-invalidarg branch June 12, 2026 00:24
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…ior (#129297)
The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when called on a valid string with no output buffer (stringData == null
or count == 0), while still populating *pNeeded. The cDAC implementation
returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity
assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception
string. Mirror the DAC: populate *pNeeded via CopyStringToBuffer, then
return E_INVALIDARG for the no-buffer case.
This fixes the build/test-break in the cDac introduced by
dotnet/diagnostics#5865.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@leculver@steveisok@max-charlamb@rcj1
, '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" + '
cDAC stress build break: match GetObjectStringData's quirky dac behavior by leculver · Pull Request #129297 · dotnet/runtime · GitHub
Skip to content

cDAC stress build break: match GetObjectStringData's quirky dac behavior - #129297

Merged
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg
Jun 11, 2026
Merged

cDAC stress build break: match GetObjectStringData's quirky dac behavior#129297
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg

Conversation

@leculver

@leculverleculver commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG when called on a valid string with no output buffer (stringData == null or count == 0), while still populating *pNeeded. The cDAC implementation returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception string. Mirror the cDac: fix the weird behavior that we don't depend on in the legacy dac, and assert similar data here.

This fixes the build/test-break in the cDac introduced by dotnet/diagnostics#5865.

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

@leculverleculver changed the title cDAC: GetObjectStringData returns E_INVALIDARG for length-only queriescDAC stress build break: match GetObjectStringData's quirky dac behaviorJun 11, 2026

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

Updates the legacy cDAC ISOSDacInterface.GetObjectStringData implementation to better match the legacy DAC’s HRESULT behavior for length-only string queries by returning E_INVALIDARG while still reporting the required buffer length.

Changes:

  • After copying/string-length computation via OutputBufferHelpers.CopyStringToBuffer, return E_INVALIDARG when there is no output buffer (stringData == null || count == 0).
  • Add an explanatory comment documenting the legacy DAC parity intent.
Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csAdjusts GetObjectStringData HRESULT for length-only queries to align with legacy DAC behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when no output buffer is available (count == 0) even on a valid string,
while still populating *pNeeded. The cDAC implementation returned S_OK,
which trips the cDAC-vs-DAC HResult parity assert when CLRMA (clrma under
dotnet-dump) sizes an exception string via GetObjectStringData(obj, 0,
nullptr, &needed).
Mirror the DAC: validate args as it does (so a non-null buffer with
count == 0 still reports the needed size), populate *pNeeded via
CopyStringToBuffer, then return E_INVALIDARG when count == 0. CLRMA
explicitly ignores that HRESULT and uses the reported size.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculverforce-pushed the cdac-getobjectstringdata-invalidarg branch from 5de372f to 629af16CompareJune 11, 2026 16:26
CopilotAI review requested due to automatic review settings June 11, 2026 16:47

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.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Invoke the legacy DAC with the same stringData/pNeeded nullness the caller
passed to the cDAC, so the debug HRESULT comparison is apples-to-apples and
can't manufacture a spurious divergence from substituted arguments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculver enabled auto-merge (squash) June 11, 2026 17:30
…ng it
Rather than tolerating the divergence via AllowCdacSuccess, fix the legacy
DAC: ClrDataAccess::GetObjectStringData no longer returns E_INVALIDARG for a
size-only query (no output buffer) on a valid string -- it reports the needed
size via *pNeeded and succeeds, matching the cDAC. The cDAC debug parity
check returns to the default validation mode.
Also mirror the caller's stringData/pNeeded nullness into the legacy DAC call
in the debug validation, and derive the content-compare length from the cDAC
string (neededLocal is only populated when a size-out is requested), avoiding
an out-of-range span when pNeeded is null.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 18:35

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.

Copilot's findings

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

Comment threadsrc/coreclr/debug/daccess/request.cpp
@leculver
leculver merged commit c8f7ed2 into dotnet:mainJun 11, 2026
128 of 130 checks passed
@leculver
leculver deleted the cdac-getobjectstringdata-invalidarg branch June 12, 2026 00:24
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…ior (#129297)
The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when called on a valid string with no output buffer (stringData == null
or count == 0), while still populating *pNeeded. The cDAC implementation
returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity
assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception
string. Mirror the DAC: populate *pNeeded via CopyStringToBuffer, then
return E_INVALIDARG for the no-buffer case.
This fixes the build/test-break in the cDac introduced by
dotnet/diagnostics#5865.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@leculver@steveisok@max-charlamb@rcj1
, '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('^' + ".*" + ' cDAC stress build break: match GetObjectStringData's quirky dac behavior by leculver · Pull Request #129297 · dotnet/runtime · GitHub
Skip to content

cDAC stress build break: match GetObjectStringData's quirky dac behavior - #129297

Merged
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg
Jun 11, 2026
Merged

cDAC stress build break: match GetObjectStringData's quirky dac behavior#129297
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg

Conversation

@leculver

@leculverleculver commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG when called on a valid string with no output buffer (stringData == null or count == 0), while still populating *pNeeded. The cDAC implementation returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception string. Mirror the cDac: fix the weird behavior that we don't depend on in the legacy dac, and assert similar data here.

This fixes the build/test-break in the cDac introduced by dotnet/diagnostics#5865.

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

@leculverleculver changed the title cDAC: GetObjectStringData returns E_INVALIDARG for length-only queriescDAC stress build break: match GetObjectStringData's quirky dac behaviorJun 11, 2026

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

Updates the legacy cDAC ISOSDacInterface.GetObjectStringData implementation to better match the legacy DAC’s HRESULT behavior for length-only string queries by returning E_INVALIDARG while still reporting the required buffer length.

Changes:

  • After copying/string-length computation via OutputBufferHelpers.CopyStringToBuffer, return E_INVALIDARG when there is no output buffer (stringData == null || count == 0).
  • Add an explanatory comment documenting the legacy DAC parity intent.
Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csAdjusts GetObjectStringData HRESULT for length-only queries to align with legacy DAC behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when no output buffer is available (count == 0) even on a valid string,
while still populating *pNeeded. The cDAC implementation returned S_OK,
which trips the cDAC-vs-DAC HResult parity assert when CLRMA (clrma under
dotnet-dump) sizes an exception string via GetObjectStringData(obj, 0,
nullptr, &needed).
Mirror the DAC: validate args as it does (so a non-null buffer with
count == 0 still reports the needed size), populate *pNeeded via
CopyStringToBuffer, then return E_INVALIDARG when count == 0. CLRMA
explicitly ignores that HRESULT and uses the reported size.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculverforce-pushed the cdac-getobjectstringdata-invalidarg branch from 5de372f to 629af16CompareJune 11, 2026 16:26
CopilotAI review requested due to automatic review settings June 11, 2026 16:47

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.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Invoke the legacy DAC with the same stringData/pNeeded nullness the caller
passed to the cDAC, so the debug HRESULT comparison is apples-to-apples and
can't manufacture a spurious divergence from substituted arguments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculver enabled auto-merge (squash) June 11, 2026 17:30
…ng it
Rather than tolerating the divergence via AllowCdacSuccess, fix the legacy
DAC: ClrDataAccess::GetObjectStringData no longer returns E_INVALIDARG for a
size-only query (no output buffer) on a valid string -- it reports the needed
size via *pNeeded and succeeds, matching the cDAC. The cDAC debug parity
check returns to the default validation mode.
Also mirror the caller's stringData/pNeeded nullness into the legacy DAC call
in the debug validation, and derive the content-compare length from the cDAC
string (neededLocal is only populated when a size-out is requested), avoiding
an out-of-range span when pNeeded is null.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 18:35

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.

Copilot's findings

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

Comment threadsrc/coreclr/debug/daccess/request.cpp
@leculver
leculver merged commit c8f7ed2 into dotnet:mainJun 11, 2026
128 of 130 checks passed
@leculver
leculver deleted the cdac-getobjectstringdata-invalidarg branch June 12, 2026 00:24
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…ior (#129297)
The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when called on a valid string with no output buffer (stringData == null
or count == 0), while still populating *pNeeded. The cDAC implementation
returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity
assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception
string. Mirror the DAC: populate *pNeeded via CopyStringToBuffer, then
return E_INVALIDARG for the no-buffer case.
This fixes the build/test-break in the cDac introduced by
dotnet/diagnostics#5865.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@leculver@steveisok@max-charlamb@rcj1
, '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('^' + ".*" + ' cDAC stress build break: match GetObjectStringData's quirky dac behavior by leculver · Pull Request #129297 · dotnet/runtime · GitHub
Skip to content

cDAC stress build break: match GetObjectStringData's quirky dac behavior - #129297

Merged
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg
Jun 11, 2026
Merged

cDAC stress build break: match GetObjectStringData's quirky dac behavior#129297
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg

Conversation

@leculver

@leculverleculver commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG when called on a valid string with no output buffer (stringData == null or count == 0), while still populating *pNeeded. The cDAC implementation returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception string. Mirror the cDac: fix the weird behavior that we don't depend on in the legacy dac, and assert similar data here.

This fixes the build/test-break in the cDac introduced by dotnet/diagnostics#5865.

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

@leculverleculver changed the title cDAC: GetObjectStringData returns E_INVALIDARG for length-only queriescDAC stress build break: match GetObjectStringData's quirky dac behaviorJun 11, 2026

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

Updates the legacy cDAC ISOSDacInterface.GetObjectStringData implementation to better match the legacy DAC’s HRESULT behavior for length-only string queries by returning E_INVALIDARG while still reporting the required buffer length.

Changes:

  • After copying/string-length computation via OutputBufferHelpers.CopyStringToBuffer, return E_INVALIDARG when there is no output buffer (stringData == null || count == 0).
  • Add an explanatory comment documenting the legacy DAC parity intent.
Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csAdjusts GetObjectStringData HRESULT for length-only queries to align with legacy DAC behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when no output buffer is available (count == 0) even on a valid string,
while still populating *pNeeded. The cDAC implementation returned S_OK,
which trips the cDAC-vs-DAC HResult parity assert when CLRMA (clrma under
dotnet-dump) sizes an exception string via GetObjectStringData(obj, 0,
nullptr, &needed).
Mirror the DAC: validate args as it does (so a non-null buffer with
count == 0 still reports the needed size), populate *pNeeded via
CopyStringToBuffer, then return E_INVALIDARG when count == 0. CLRMA
explicitly ignores that HRESULT and uses the reported size.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculverforce-pushed the cdac-getobjectstringdata-invalidarg branch from 5de372f to 629af16CompareJune 11, 2026 16:26
CopilotAI review requested due to automatic review settings June 11, 2026 16:47

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.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Invoke the legacy DAC with the same stringData/pNeeded nullness the caller
passed to the cDAC, so the debug HRESULT comparison is apples-to-apples and
can't manufacture a spurious divergence from substituted arguments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculver enabled auto-merge (squash) June 11, 2026 17:30
…ng it
Rather than tolerating the divergence via AllowCdacSuccess, fix the legacy
DAC: ClrDataAccess::GetObjectStringData no longer returns E_INVALIDARG for a
size-only query (no output buffer) on a valid string -- it reports the needed
size via *pNeeded and succeeds, matching the cDAC. The cDAC debug parity
check returns to the default validation mode.
Also mirror the caller's stringData/pNeeded nullness into the legacy DAC call
in the debug validation, and derive the content-compare length from the cDAC
string (neededLocal is only populated when a size-out is requested), avoiding
an out-of-range span when pNeeded is null.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 18:35

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.

Copilot's findings

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

Comment threadsrc/coreclr/debug/daccess/request.cpp
@leculver
leculver merged commit c8f7ed2 into dotnet:mainJun 11, 2026
128 of 130 checks passed
@leculver
leculver deleted the cdac-getobjectstringdata-invalidarg branch June 12, 2026 00:24
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…ior (#129297)
The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when called on a valid string with no output buffer (stringData == null
or count == 0), while still populating *pNeeded. The cDAC implementation
returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity
assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception
string. Mirror the DAC: populate *pNeeded via CopyStringToBuffer, then
return E_INVALIDARG for the no-buffer case.
This fixes the build/test-break in the cDac introduced by
dotnet/diagnostics#5865.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@leculver@steveisok@max-charlamb@rcj1
, '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" + ' cDAC stress build break: match GetObjectStringData's quirky dac behavior by leculver · Pull Request #129297 · dotnet/runtime · GitHub
Skip to content

cDAC stress build break: match GetObjectStringData's quirky dac behavior - #129297

Merged
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg
Jun 11, 2026
Merged

cDAC stress build break: match GetObjectStringData's quirky dac behavior#129297
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg

Conversation

@leculver

@leculverleculver commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG when called on a valid string with no output buffer (stringData == null or count == 0), while still populating *pNeeded. The cDAC implementation returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception string. Mirror the cDac: fix the weird behavior that we don't depend on in the legacy dac, and assert similar data here.

This fixes the build/test-break in the cDac introduced by dotnet/diagnostics#5865.

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

@leculverleculver changed the title cDAC: GetObjectStringData returns E_INVALIDARG for length-only queriescDAC stress build break: match GetObjectStringData's quirky dac behaviorJun 11, 2026

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

Updates the legacy cDAC ISOSDacInterface.GetObjectStringData implementation to better match the legacy DAC’s HRESULT behavior for length-only string queries by returning E_INVALIDARG while still reporting the required buffer length.

Changes:

  • After copying/string-length computation via OutputBufferHelpers.CopyStringToBuffer, return E_INVALIDARG when there is no output buffer (stringData == null || count == 0).
  • Add an explanatory comment documenting the legacy DAC parity intent.
Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csAdjusts GetObjectStringData HRESULT for length-only queries to align with legacy DAC behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when no output buffer is available (count == 0) even on a valid string,
while still populating *pNeeded. The cDAC implementation returned S_OK,
which trips the cDAC-vs-DAC HResult parity assert when CLRMA (clrma under
dotnet-dump) sizes an exception string via GetObjectStringData(obj, 0,
nullptr, &needed).
Mirror the DAC: validate args as it does (so a non-null buffer with
count == 0 still reports the needed size), populate *pNeeded via
CopyStringToBuffer, then return E_INVALIDARG when count == 0. CLRMA
explicitly ignores that HRESULT and uses the reported size.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculverforce-pushed the cdac-getobjectstringdata-invalidarg branch from 5de372f to 629af16CompareJune 11, 2026 16:26
CopilotAI review requested due to automatic review settings June 11, 2026 16:47

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.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Invoke the legacy DAC with the same stringData/pNeeded nullness the caller
passed to the cDAC, so the debug HRESULT comparison is apples-to-apples and
can't manufacture a spurious divergence from substituted arguments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculver enabled auto-merge (squash) June 11, 2026 17:30
…ng it
Rather than tolerating the divergence via AllowCdacSuccess, fix the legacy
DAC: ClrDataAccess::GetObjectStringData no longer returns E_INVALIDARG for a
size-only query (no output buffer) on a valid string -- it reports the needed
size via *pNeeded and succeeds, matching the cDAC. The cDAC debug parity
check returns to the default validation mode.
Also mirror the caller's stringData/pNeeded nullness into the legacy DAC call
in the debug validation, and derive the content-compare length from the cDAC
string (neededLocal is only populated when a size-out is requested), avoiding
an out-of-range span when pNeeded is null.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 18:35

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.

Copilot's findings

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

Comment threadsrc/coreclr/debug/daccess/request.cpp
@leculver
leculver merged commit c8f7ed2 into dotnet:mainJun 11, 2026
128 of 130 checks passed
@leculver
leculver deleted the cdac-getobjectstringdata-invalidarg branch June 12, 2026 00:24
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…ior (#129297)
The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when called on a valid string with no output buffer (stringData == null
or count == 0), while still populating *pNeeded. The cDAC implementation
returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity
assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception
string. Mirror the DAC: populate *pNeeded via CopyStringToBuffer, then
return E_INVALIDARG for the no-buffer case.
This fixes the build/test-break in the cDac introduced by
dotnet/diagnostics#5865.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@leculver@steveisok@max-charlamb@rcj1
, '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('^' + ".*" + ' cDAC stress build break: match GetObjectStringData's quirky dac behavior by leculver · Pull Request #129297 · dotnet/runtime · GitHub
Skip to content

cDAC stress build break: match GetObjectStringData's quirky dac behavior - #129297

Merged
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg
Jun 11, 2026
Merged

cDAC stress build break: match GetObjectStringData's quirky dac behavior#129297
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg

Conversation

@leculver

@leculverleculver commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG when called on a valid string with no output buffer (stringData == null or count == 0), while still populating *pNeeded. The cDAC implementation returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception string. Mirror the cDac: fix the weird behavior that we don't depend on in the legacy dac, and assert similar data here.

This fixes the build/test-break in the cDac introduced by dotnet/diagnostics#5865.

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

@leculverleculver changed the title cDAC: GetObjectStringData returns E_INVALIDARG for length-only queriescDAC stress build break: match GetObjectStringData's quirky dac behaviorJun 11, 2026

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

Updates the legacy cDAC ISOSDacInterface.GetObjectStringData implementation to better match the legacy DAC’s HRESULT behavior for length-only string queries by returning E_INVALIDARG while still reporting the required buffer length.

Changes:

  • After copying/string-length computation via OutputBufferHelpers.CopyStringToBuffer, return E_INVALIDARG when there is no output buffer (stringData == null || count == 0).
  • Add an explanatory comment documenting the legacy DAC parity intent.
Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csAdjusts GetObjectStringData HRESULT for length-only queries to align with legacy DAC behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when no output buffer is available (count == 0) even on a valid string,
while still populating *pNeeded. The cDAC implementation returned S_OK,
which trips the cDAC-vs-DAC HResult parity assert when CLRMA (clrma under
dotnet-dump) sizes an exception string via GetObjectStringData(obj, 0,
nullptr, &needed).
Mirror the DAC: validate args as it does (so a non-null buffer with
count == 0 still reports the needed size), populate *pNeeded via
CopyStringToBuffer, then return E_INVALIDARG when count == 0. CLRMA
explicitly ignores that HRESULT and uses the reported size.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculverforce-pushed the cdac-getobjectstringdata-invalidarg branch from 5de372f to 629af16CompareJune 11, 2026 16:26
CopilotAI review requested due to automatic review settings June 11, 2026 16:47

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.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Invoke the legacy DAC with the same stringData/pNeeded nullness the caller
passed to the cDAC, so the debug HRESULT comparison is apples-to-apples and
can't manufacture a spurious divergence from substituted arguments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculver enabled auto-merge (squash) June 11, 2026 17:30
…ng it
Rather than tolerating the divergence via AllowCdacSuccess, fix the legacy
DAC: ClrDataAccess::GetObjectStringData no longer returns E_INVALIDARG for a
size-only query (no output buffer) on a valid string -- it reports the needed
size via *pNeeded and succeeds, matching the cDAC. The cDAC debug parity
check returns to the default validation mode.
Also mirror the caller's stringData/pNeeded nullness into the legacy DAC call
in the debug validation, and derive the content-compare length from the cDAC
string (neededLocal is only populated when a size-out is requested), avoiding
an out-of-range span when pNeeded is null.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 18:35

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.

Copilot's findings

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

Comment threadsrc/coreclr/debug/daccess/request.cpp
@leculver
leculver merged commit c8f7ed2 into dotnet:mainJun 11, 2026
128 of 130 checks passed
@leculver
leculver deleted the cdac-getobjectstringdata-invalidarg branch June 12, 2026 00:24
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…ior (#129297)
The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when called on a valid string with no output buffer (stringData == null
or count == 0), while still populating *pNeeded. The cDAC implementation
returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity
assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception
string. Mirror the DAC: populate *pNeeded via CopyStringToBuffer, then
return E_INVALIDARG for the no-buffer case.
This fixes the build/test-break in the cDac introduced by
dotnet/diagnostics#5865.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@leculver@steveisok@max-charlamb@rcj1
, '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); } })(); })(); cDAC stress build break: match GetObjectStringData's quirky dac behavior by leculver · Pull Request #129297 · dotnet/runtime · GitHub
Skip to content

cDAC stress build break: match GetObjectStringData's quirky dac behavior - #129297

Merged
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg
Jun 11, 2026
Merged

cDAC stress build break: match GetObjectStringData's quirky dac behavior#129297
leculver merged 4 commits into
dotnet:mainfrom
leculver:cdac-getobjectstringdata-invalidarg

Conversation

@leculver

@leculverleculver commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG when called on a valid string with no output buffer (stringData == null or count == 0), while still populating *pNeeded. The cDAC implementation returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception string. Mirror the cDac: fix the weird behavior that we don't depend on in the legacy dac, and assert similar data here.

This fixes the build/test-break in the cDac introduced by dotnet/diagnostics#5865.

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

@leculverleculver changed the title cDAC: GetObjectStringData returns E_INVALIDARG for length-only queriescDAC stress build break: match GetObjectStringData's quirky dac behaviorJun 11, 2026

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

Updates the legacy cDAC ISOSDacInterface.GetObjectStringData implementation to better match the legacy DAC’s HRESULT behavior for length-only string queries by returning E_INVALIDARG while still reporting the required buffer length.

Changes:

  • After copying/string-length computation via OutputBufferHelpers.CopyStringToBuffer, return E_INVALIDARG when there is no output buffer (stringData == null || count == 0).
  • Add an explanatory comment documenting the legacy DAC parity intent.
Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csAdjusts GetObjectStringData HRESULT for length-only queries to align with legacy DAC behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when no output buffer is available (count == 0) even on a valid string,
while still populating *pNeeded. The cDAC implementation returned S_OK,
which trips the cDAC-vs-DAC HResult parity assert when CLRMA (clrma under
dotnet-dump) sizes an exception string via GetObjectStringData(obj, 0,
nullptr, &needed).
Mirror the DAC: validate args as it does (so a non-null buffer with
count == 0 still reports the needed size), populate *pNeeded via
CopyStringToBuffer, then return E_INVALIDARG when count == 0. CLRMA
explicitly ignores that HRESULT and uses the reported size.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculverforce-pushed the cdac-getobjectstringdata-invalidarg branch from 5de372f to 629af16CompareJune 11, 2026 16:26
CopilotAI review requested due to automatic review settings June 11, 2026 16:47

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.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Invoke the legacy DAC with the same stringData/pNeeded nullness the caller
passed to the cDAC, so the debug HRESULT comparison is apples-to-apples and
can't manufacture a spurious divergence from substituted arguments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@leculver
leculver enabled auto-merge (squash) June 11, 2026 17:30
…ng it
Rather than tolerating the divergence via AllowCdacSuccess, fix the legacy
DAC: ClrDataAccess::GetObjectStringData no longer returns E_INVALIDARG for a
size-only query (no output buffer) on a valid string -- it reports the needed
size via *pNeeded and succeeds, matching the cDAC. The cDAC debug parity
check returns to the default validation mode.
Also mirror the caller's stringData/pNeeded nullness into the legacy DAC call
in the debug validation, and derive the content-compare length from the cDAC
string (neededLocal is only populated when a size-out is requested), avoiding
an out-of-range span when pNeeded is null.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 18:35

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.

Copilot's findings

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

Comment threadsrc/coreclr/debug/daccess/request.cpp
@leculver
leculver merged commit c8f7ed2 into dotnet:mainJun 11, 2026
128 of 130 checks passed
@leculver
leculver deleted the cdac-getobjectstringdata-invalidarg branch June 12, 2026 00:24
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…ior (#129297)
The legacy DAC (ClrDataAccess::GetObjectStringData) returns E_INVALIDARG
when called on a valid string with no output buffer (stringData == null
or count == 0), while still populating *pNeeded. The cDAC implementation
returned S_OK in that case, which trips the cDAC-vs-DAC HResult parity
assert (SOSDacImpl.cs ValidateHResult) when clrma sizes an exception
string. Mirror the DAC: populate *pNeeded via CopyStringToBuffer, then
return E_INVALIDARG for the no-buffer case.
This fixes the build/test-break in the cDac introduced by
dotnet/diagnostics#5865.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@leculver@steveisok@max-charlamb@rcj1