diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs index 1052e9519020cd..579f74d2f6eda1 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs @@ -536,7 +536,8 @@ private ClrDataValue CreateValueFromDebugInfo( return null; } - mdReader = _target.Contracts.EcmaMetadata.GetMetadata(moduleHandle)!; + mdReader = _target.Contracts.EcmaMetadata.GetMetadata(moduleHandle) + ?? throw new InvalidOperationException("Module has no metadata."); StandaloneSignatureHandle localSigHandle = MetadataTokens.StandaloneSignatureHandle(localToken); BlobHandle localSigBlob = mdReader.GetStandaloneSignature(localSigHandle).Signature; return mdReader.GetBlobReader(localSigBlob); @@ -789,7 +790,8 @@ private static (uint Flags, int Size) CheckEnumFromTypeDef(MetadataReader reader { // For TypeRefs, try to resolve in the same module's TypeDef table. TypeReference typeRef = reader.GetTypeReference(handle); - MetadataReader moduleReader = _target.Contracts.EcmaMetadata.GetMetadata(_moduleHandle)!; + MetadataReader moduleReader = _target.Contracts.EcmaMetadata.GetMetadata(_moduleHandle) + ?? throw new InvalidOperationException("Module has no metadata."); foreach (TypeDefinitionHandle tdh in moduleReader.TypeDefinitions) { TypeDefinition td = moduleReader.GetTypeDefinition(tdh); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs index 6e194d4b19155c..63fa9c372a7892 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs @@ -298,16 +298,28 @@ int IXCLRDataModule.StartEnumMethodDefinitionsByName(char* name, uint flags, ulo // start: find the type. ILoader loader = _target.Contracts.Loader; Contracts.ModuleHandle moduleHandle = loader.GetModuleHandleFromModulePtr(_address); - MetadataReader reader = _target.Contracts.EcmaMetadata.GetMetadata(moduleHandle)!; + MetadataReader reader = _target.Contracts.EcmaMetadata.GetMetadata(moduleHandle) + ?? throw new InvalidOperationException("Module has no metadata."); EnumMethodDefinitions emd = new(reader, flags, (nuint)handleLocal); emd.Start(fullName); *handle = (ulong)((IEnum)emd).GetHandle(); + // Legacy handle ownership transferred to emd. + handleLocal = default; } catch (System.Exception ex) { hr = ex.HResult; } + finally + { + // The legacy enumeration is started before the cDAC work. If that work fails, + // the caller receives a null handle and cannot end the legacy enumeration. + if (_legacyModule is not null && handleLocal != default) + { + _legacyModule.EndEnumMethodDefinitionsByName(handleLocal); + } + } #if DEBUG if (_legacyModule is not null) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.cs index 0481f2c9bd129e..87b4e10672136e 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.cs @@ -4770,7 +4770,8 @@ public int GetObjectFields(ulong id, uint celt, COR_FIELD* layout, uint* pceltFe TypeHandle enclosingTypeHandle = rts.GetTypeHandle(enclosingMT); TargetPointer enclosingModulePtr = rts.GetModule(enclosingTypeHandle); Contracts.ModuleHandle enclosingModuleHandle = _target.Contracts.Loader.GetModuleHandleFromModulePtr(enclosingModulePtr); - MetadataReader enclosingMdReader = ecmaMetadataContract.GetMetadata(enclosingModuleHandle)!; + MetadataReader enclosingMdReader = ecmaMetadataContract.GetMetadata(enclosingModuleHandle) + ?? throw new InvalidOperationException("Module has no metadata."); FieldDefinitionHandle fieldDefHandle = (FieldDefinitionHandle)MetadataTokens.Handle((int)memberDef); FieldDefinition fieldDef = enclosingMdReader.GetFieldDefinition(fieldDefHandle); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index 03576016dfc336..0be9f10f0408cb 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -1070,7 +1070,8 @@ int ISOSDacInterface.GetFieldDescData(ClrDataAddress fieldDesc, DacpFieldDescDat TypeHandle ctx = rtsContract.GetTypeHandle(enclosingMT); TargetPointer modulePtr = rtsContract.GetModule(ctx); Contracts.ModuleHandle moduleHandle = _target.Contracts.Loader.GetModuleHandleFromModulePtr(modulePtr); - MetadataReader mdReader = ecmaMetadataContract.GetMetadata(moduleHandle)!; + MetadataReader mdReader = ecmaMetadataContract.GetMetadata(moduleHandle) + ?? throw new InvalidOperationException("Module has no metadata."); FieldDefinition fieldDef = mdReader.GetFieldDefinition(fieldHandle); TypeHandle foundTypeHandle = rtsContract.GetFieldDescApproxTypeHandle(fieldDescTargetPtr); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SigFormat.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SigFormat.cs index 6e41501fab87f7..710c91149ae1dd 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SigFormat.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SigFormat.cs @@ -180,7 +180,8 @@ private static unsafe void AddTypeString(Target target, uint typeDefToken = runtimeTypeSystem.GetTypeDefToken(th); TargetPointer modulePointer = target.Contracts.RuntimeTypeSystem.GetModule(th); Contracts.ModuleHandle module = target.Contracts.Loader.GetModuleHandleFromModulePtr(modulePointer); - MetadataReader internalTypeMetadata = target.Contracts.EcmaMetadata.GetMetadata(module)!; + MetadataReader internalTypeMetadata = target.Contracts.EcmaMetadata.GetMetadata(module) + ?? throw new InvalidOperationException("Module has no metadata."); TypeDefinition internalTypeDef = internalTypeMetadata.GetTypeDefinition((TypeDefinitionHandle)MetadataTokens.Handle((int)typeDefToken)); _namespace = internalTypeMetadata.GetString(internalTypeDef.Namespace); @@ -346,7 +347,8 @@ private static void AddType(Target target, StringBuilder stringBuilder, TypeHand uint typeDefToken = runtimeTypeSystem.GetTypeDefToken(typeHandle); TargetPointer modulePointer = target.Contracts.RuntimeTypeSystem.GetModule(typeHandle); Contracts.ModuleHandle module = target.Contracts.Loader.GetModuleHandleFromModulePtr(modulePointer); - MetadataReader metadata = target.Contracts.EcmaMetadata.GetMetadata(module)!; + MetadataReader metadata = target.Contracts.EcmaMetadata.GetMetadata(module) + ?? throw new InvalidOperationException("Module has no metadata."); TypeDefinition typeDef = metadata.GetTypeDefinition((TypeDefinitionHandle)MetadataTokens.Handle((int)typeDefToken)); string _namespace = metadata.GetString(typeDef.Namespace); string name = metadata.GetString(typeDef.Name); @@ -391,7 +393,8 @@ private static void AddType(Target target, StringBuilder stringBuilder, TypeHand case CorElementType.Var: runtimeTypeSystem.IsGenericVariable(typeHandle, out TargetPointer genericVariableModulePointer, out uint typeVarToken); Contracts.ModuleHandle genericVariableModule = target.Contracts.Loader.GetModuleHandleFromModulePtr(genericVariableModulePointer); - MetadataReader generatedVariableMetadata = target.Contracts.EcmaMetadata.GetMetadata(genericVariableModule)!; + MetadataReader generatedVariableMetadata = target.Contracts.EcmaMetadata.GetMetadata(genericVariableModule) + ?? throw new InvalidOperationException("Module has no metadata."); GenericParameter genericVariable = generatedVariableMetadata.GetGenericParameter((GenericParameterHandle)MetadataTokens.Handle((int)typeVarToken)); stringBuilder.Append(generatedVariableMetadata.GetString(genericVariable.Name)); return; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/TypeNameBuilder.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/TypeNameBuilder.cs index e481d0cc471fe3..1b8b31cfd25166 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/TypeNameBuilder.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/TypeNameBuilder.cs @@ -123,7 +123,8 @@ public static void AppendMethodImpl(Target target, StringBuilder stringBuilder, if (rowId != 0) { Contracts.ModuleHandle module = loader.GetModuleHandleFromModulePtr(runtimeTypeSystem.GetModule(th)); - MetadataReader reader = target.Contracts.EcmaMetadata.GetMetadata(module)!; + MetadataReader reader = target.Contracts.EcmaMetadata.GetMetadata(module) + ?? throw new InvalidOperationException("Module has no metadata."); MethodDefinition methodDef = reader.GetMethodDefinition(MetadataTokens.MethodDefinitionHandle((int)rowId)); stringBuilder.Append(reader.GetString(methodDef.Name)); } @@ -224,7 +225,8 @@ private static void AppendTypeCore(ref TypeNameBuilder tnb, Contracts.TypeHandle else if (typeSystemContract.IsGenericVariable(typeHandle, out TargetPointer modulePointer, out uint genericParamToken)) { Contracts.ModuleHandle module = tnb.Target.Contracts.Loader.GetModuleHandleFromModulePtr(modulePointer); - MetadataReader reader = tnb.Target.Contracts.EcmaMetadata.GetMetadata(module)!; + MetadataReader reader = tnb.Target.Contracts.EcmaMetadata.GetMetadata(module) + ?? throw new InvalidOperationException("Module has no metadata."); var handle = (GenericParameterHandle)MetadataTokens.Handle((int)genericParamToken); GenericParameter genericParam = reader.GetGenericParameter(handle); if (format.HasFlag(TypeNameFormat.FormatGenericParam)) @@ -291,7 +293,8 @@ private static void AppendTypeCore(ref TypeNameBuilder tnb, Contracts.TypeHandle } else { - MetadataReader reader = tnb.Target.Contracts.EcmaMetadata.GetMetadata(moduleHandle)!; + MetadataReader reader = tnb.Target.Contracts.EcmaMetadata.GetMetadata(moduleHandle) + ?? throw new InvalidOperationException("Module has no metadata."); AppendNestedTypeDef(ref tnb, reader, (TypeDefinitionHandle)MetadataTokens.EntityHandle((int)typeDefToken), format); } @@ -318,7 +321,8 @@ private static void AppendTypeCore(ref TypeNameBuilder tnb, Contracts.TypeHandle Contracts.ModuleHandle module = tnb.Target.Contracts.Loader.GetModuleHandleFromModulePtr(modulePtr); // NOTE: The DAC variant of assembly name generation is different than the runtime version. The DAC variant is simpler, and only uses SimpleName - MetadataReader mr = tnb.Target.Contracts.EcmaMetadata.GetMetadata(module)!; + MetadataReader mr = tnb.Target.Contracts.EcmaMetadata.GetMetadata(module) + ?? throw new InvalidOperationException("Module has no metadata."); string assemblySimpleName = mr.GetString(mr.GetAssemblyDefinition().Name); tnb.AddAssemblySpec(assemblySimpleName);