dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
15.42k stars 4.76k forks source link

[release/9.0-staging] Fix handling of IDynamicInterfaceCastable wrt CastCache #110007

Open github-actions[bot] opened 2 days ago

github-actions[bot] commented 2 days ago

Backport of #108328 to release/9.0-staging

/cc @MichalStrehovsky

Customer Impact

One more IDynamicInterfaceCastable related issue. This one was found as we were unblocking tests as part of fixing a customer reported issue (that was known and had known disabled tests). The tests happened to also hit this problem.

The issue is that a cast of a IDynamicInterfaceCastable object to a variant interface would store the wrong value into CastCache - we'd answer the first cast correctly, but a second time the same pair of type is checked for castability, we'd use the wrong cached value and invalid cast exception would happen.

Regression

Regressed in .NET 8, likely in #90234.

Testing

Added targeted test that is part of this PR. We also subsequently enabled more testing in #108376 but that depends on both PRs so it's in a separate PR.

Risk

This should be low risk, it only affects IDynamicInterfaceCastable and we made sure the caching logic is same as CoreCLR. This has been in main for 2 months.

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

dotnet-policy-service[bot] commented 2 days ago

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas See info in area-owners.md if you want to be subscribed.