Skip to content

Commit 2a49f6e

Browse files
jkotasradical
authored andcommitted
Fix race condition in System.Reflection.FieldAccessor (dotnet#99329)
Fixes dotnet#98998
1 parent 21d174a commit 2a49f6e

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

src/libraries/System.Private.CoreLib/src/System/Reflection/FieldAccessor.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ internal sealed class FieldAccessor
1313
private readonly RtFieldInfo _fieldInfo;
1414
private IntPtr _addressOrOffset;
1515
private unsafe MethodTable* _methodTable;
16-
private FieldAccessorType _fieldAccessType;
16+
private volatile FieldAccessorType _fieldAccessType;
1717

1818
internal FieldAccessor(FieldInfo fieldInfo)
1919
{
@@ -52,19 +52,19 @@ private void Initialize()
5252
{
5353
if (fieldType.IsEnum)
5454
{
55-
_fieldAccessType = GetPrimitiveAccessorTypeForStatic(fieldType.GetEnumUnderlyingType());
5655
_methodTable = (MethodTable*)fieldType.TypeHandle.Value;
56+
_fieldAccessType = GetPrimitiveAccessorTypeForStatic(fieldType.GetEnumUnderlyingType());
5757
}
5858
else if (RuntimeTypeHandle.GetCorElementType(fieldType) == CorElementType.ELEMENT_TYPE_VALUETYPE)
5959
{
6060
// The runtime stores non-primitive value types as a boxed value.
61-
_fieldAccessType = FieldAccessorType.StaticValueTypeBoxed;
6261
_methodTable = (MethodTable*)fieldType.TypeHandle.Value;
62+
_fieldAccessType = FieldAccessorType.StaticValueTypeBoxed;
6363
}
6464
else
6565
{
66-
_fieldAccessType = GetPrimitiveAccessorTypeForStatic(fieldType);
6766
_methodTable = (MethodTable*)fieldType.TypeHandle.Value;
67+
_fieldAccessType = GetPrimitiveAccessorTypeForStatic(fieldType);
6868
}
6969
}
7070
else if (fieldType.IsPointer)
@@ -73,8 +73,8 @@ private void Initialize()
7373
}
7474
else if (fieldType.IsFunctionPointer)
7575
{
76-
_fieldAccessType = GetIntPtrAccessorTypeForStatic();
7776
_methodTable = (MethodTable*)typeof(IntPtr).TypeHandle.Value;
77+
_fieldAccessType = GetIntPtrAccessorTypeForStatic();
7878
}
7979
else
8080
{
@@ -87,22 +87,22 @@ private void Initialize()
8787

8888
if (fieldType.IsEnum)
8989
{
90-
_fieldAccessType = GetPrimitiveAccessorTypeForInstance(fieldType.GetEnumUnderlyingType());
9190
_methodTable = (MethodTable*)fieldType.TypeHandle.Value;
91+
_fieldAccessType = GetPrimitiveAccessorTypeForInstance(fieldType.GetEnumUnderlyingType());
9292
}
9393
else if (fieldType.IsValueType)
9494
{
95-
_fieldAccessType = GetPrimitiveAccessorTypeForInstance(fieldType);
9695
_methodTable = (MethodTable*)fieldType.TypeHandle.Value;
96+
_fieldAccessType = GetPrimitiveAccessorTypeForInstance(fieldType);
9797
}
9898
else if (fieldType.IsPointer)
9999
{
100100
_fieldAccessType = FieldAccessorType.InstancePointerType;
101101
}
102102
else if (fieldType.IsFunctionPointer)
103103
{
104-
_fieldAccessType = GetIntPtrAccessorTypeForInstance();
105104
_methodTable = (MethodTable*)typeof(IntPtr).TypeHandle.Value;
105+
_fieldAccessType = GetIntPtrAccessorTypeForInstance();
106106
}
107107
else
108108
{

0 commit comments

Comments
 (0)