[release/9.0-staging] Address COM interop case involving legacy wCode usage.#117641
Closed
github-actions[bot] wants to merge 4 commits intorelease/9.0-stagingfrom
Closed
[release/9.0-staging] Address COM interop case involving legacy wCode usage.#117641github-actions[bot] wants to merge 4 commits intorelease/9.0-stagingfrom
wCode usage.#117641github-actions[bot] wants to merge 4 commits intorelease/9.0-stagingfrom
Conversation
The wCode field in the EXCEPINFO is a 16-bit signed integer. This is a legacy field for 16-bit Windows, but is still used in many COM servers. The current implementation assumed it would result in an Exception using Marshal.GetExceptionForHR(), but converting a short to an int, will rarely result in a negative value which means null will almost always be returned. This change checks if the exception is null and if so, creates a simple COMException with the error code.
Contributor
|
Tagging subscribers to this area: @cston |
jeffschwMSFT
approved these changes
Jul 15, 2025
Member
jeffschwMSFT
left a comment
There was a problem hiding this comment.
lgtm. please get a code review. we will take for consideration in 9.0.x
elinor-fung
approved these changes
Jul 15, 2025
Member
|
Closing. This doesn't meet the .NET 9.0 bar for compat risk reasons at present. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Backport of #117596 to release/9.0-staging
/cc @AaronRobinsonMSFT
Customer Impact
A customer has uncovered a degenerate case using
dynamicCOM support and legacy COM servers using thewCodefield onEXCEPINFO.The existing code incorrectly handles this case at the following location. If errorCode is a non-failing HRESULT, this will crash.
runtime/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/ExcepInfo.cs
Lines 58 to 79 in e53094d
Technical details
The
wCodefield in theEXCEPINFOis a 16-bit signed integer. This is a legacy field for 16-bit Windows, but is still used in many COM servers. The current implementation assumed it would result in anExceptionusingMarshal.GetExceptionForHR(), but converting ashortto anint, will rarely result in a negative value which meansnullwill almost always be returned. This change checks if the exception isnulland if so, creates a simpleCOMExceptionwith the error code.Regression
This has been a long standing issue, even existing in .NET Framework. The generally manifests as a
NullReferenceExceptiondue to invalid processing of an error code. The original error code is lost. This fix will now throw an exception with the error code returned by the COM server.Testing
A test was added and the customer verified the fix worked for them.
Risk
Low from a functional standpoint. It is Medium from a compat perspective. We will not be throwing a
COMExceptionwith the error code instead of aNullReferenceException.IMPORTANT: If this backport is for a servicing release, please verify that:
release/X.0-staging, notrelease/X.0.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.