[release/9.0-staging] Address COM interop case involving legacy wCode usage.
#117641
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.