dotnet / dotnet/runtime

CustomAttribute.DecodeValue doesn't handle generic type instantiations

Open
#123,878 2 comments 0 reactions 0 assignees View on GitHub
area-System.Reflection.Metadata disabled-test
Dominant language
C#
Stars
18.3k
Forks
5.6k
PR merge metrics
PR metrics pending

Description

Following program throws BadImageFormatException because `CustomAttributeDecoder.DecodeFixedArgumentType` doesn't handle `SignatureTypeCode.GenericTypeInstance`.

```csharp
using System;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;

unsafe class Program
{
static void Main()
{
typeof(ClassWithGenericEnumAttribute).Assembly.TryGetRawMetadata(out byte* blob, out int length);
var reader = new MetadataReader(blob, length);
var def = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(typeof(ClassWithGenericEnumAttribute).MetadataToken));
foreach (var attr in def.GetCustomAttributes())
{
reader.GetCustomAttribute(attr).DecodeValue(new CustomAttributeTypeProvider());
}
}
}

internal class CustomAttributeTypeProvider : ICustomAttributeTypeProvider
{
public object GetPrimitiveType(PrimitiveTypeCode typeCode) => throw new NotImplementedException();
public object GetSystemType() => throw new NotImplementedException();
public object GetSZArrayType(object elementType) => throw new NotImplementedException();
public object GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind) => throw new NotImplementedException();
public object GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) => throw new NotImplementedException();
public object GetTypeFromSerializedName(string name) => throw new NotImplementedException();
public PrimitiveTypeCode GetUnderlyingEnumType(object type) => throw new NotImplementedException();
public bool IsSystemType(object type) => throw new NotImplementedException();
}

class GenericEnumAttributeWithFunctionPointer : Attribute
{
public unsafe GenericEnumAttributeWithFunctionPointer(GenericClassForEnum[]>.E e) { }
}

class GenericClassForEnum
{
public enum E { }
}

[GenericEnumAttributeWithFunctionPointer(default)]
unsafe class ClassWithGenericEnumAttribute { }
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.