Skip to content

[release/10.0] Fix IJW OverflowException with 17+ by-ref parameters#127342

Merged
JulieLeeMSFT merged 6 commits intorelease/10.0from
backport/pr-127182-to-release/10.0
Apr 24, 2026
Merged

[release/10.0] Fix IJW OverflowException with 17+ by-ref parameters#127342
JulieLeeMSFT merged 6 commits intorelease/10.0from
backport/pr-127182-to-release/10.0

Conversation

@github-actions
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot commented Apr 23, 2026

Backport of #127182 to release/10.0

/cc @jkoritzinsky

Customer Impact

  • Customer reported
  • Found internally

Calls from native code to managed in C++/CLI with 17 byref parameters crashes the process. #127166

This PR fixes the underlying buffer management issue that causes the problem

Regression

  • Yes
  • No

#106000

Testing

Unit tests were added.

Risk

Low, only hit with extremely long signatures and we have testing guarding this scenario now.

IMPORTANT: If this backport is for a servicing release, please verify that:

  • For .NET 8 and .NET 9: The PR target branch is release/X.0-staging, not release/X.0.
  • For .NET 10+: The PR target branch is release/X.0 (no -staging suffix).

Package authoring no longer needed in .NET 9

IMPORTANT: Starting with .NET 9, you no longer need to edit a NuGet package's csproj to enable building and bump the version.
Keep in mind that we still need package authoring in .NET 8 and older versions.

jkoritzinsky and others added 6 commits April 23, 2026 20:31
StubSigBuilder::EnsureEnoughQuickBytes only doubled the buffer size once,
so when the required size exceeded 2x the current buffer, the CQuickBytes
inline buffer (512 bytes) overflowed into the adjacent m_nItems field.

This was triggered by PR #106000 which changed ConvertToInternalSignature
to preserve custom modifiers (bSkipCustomModifier=FALSE). Each preserved
modifier adds 10 bytes (ELEMENT_TYPE_CMOD_INTERNAL + required byte +
8-byte TypeHandle pointer) to the signature. For 18+ parameters with
custom modifiers, the total signature exceeded 512 bytes, causing a
buffer overflow that corrupted m_nItems and led to an OverflowException.

The fix loops the doubling until the buffer is large enough.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Use S_SIZE_T for checked arithmetic in EnsureEnoughQuickBytes to
  prevent infinite loop or undersized allocation on SIZE_T overflow.
- Remove unnecessary NativeSum18ByRefEntryPoint DLL export.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@dotnet-policy-service
Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/interop-contrib
See info in area-owners.md if you want to be subscribed.

@JulieLeeMSFT JulieLeeMSFT added Servicing-consider Issue for next servicing release review Servicing-approved Approved for servicing release and removed Servicing-consider Issue for next servicing release review labels Apr 24, 2026
@JulieLeeMSFT JulieLeeMSFT merged commit 413eaa6 into release/10.0 Apr 24, 2026
122 of 126 checks passed
@JulieLeeMSFT JulieLeeMSFT deleted the backport/pr-127182-to-release/10.0 branch April 24, 2026 22:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-Interop-coreclr Servicing-approved Approved for servicing release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants