Skip to content

Commit a29fe5e

Browse files
JniObjectReferenceControlBlock.Alloc() takes JniObjectReference
We think this could be a potential race condition
1 parent 06a6a1e commit a29fe5e

File tree

3 files changed

+13
-8
lines changed

3 files changed

+13
-8
lines changed

src/Java.Interop/Java.Interop/JavaException.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,11 @@ protected void SetPeerReference (ref JniObjectReference reference, JniObjectRefe
138138
var c = jniObjectReferenceControlBlock;
139139
if (c == null) {
140140
c = jniObjectReferenceControlBlock =
141-
Java.Interop.JniObjectReferenceControlBlock.Alloc ();
141+
Java.Interop.JniObjectReferenceControlBlock.Alloc (reference);
142+
} else {
143+
c->handle = reference.Handle;
144+
c->handle_type = (int) reference.Type;
142145
}
143-
c->handle = reference.Handle;
144-
c->handle_type = (int) reference.Type;
145146
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
146147

147148
JniObjectReference.Dispose (ref reference, options);

src/Java.Interop/Java.Interop/JavaObject.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,11 @@ protected void SetPeerReference (ref JniObjectReference reference, JniObjectRefe
9393
var c = jniObjectReferenceControlBlock;
9494
if (c == null) {
9595
c = jniObjectReferenceControlBlock =
96-
Java.Interop.JniObjectReferenceControlBlock.Alloc ();
96+
Java.Interop.JniObjectReferenceControlBlock.Alloc (reference);
97+
} else {
98+
c->handle = reference.Handle;
99+
c->handle_type = (int) reference.Type;
97100
}
98-
c->handle = reference.Handle;
99-
c->handle_type = (int) reference.Type;
100101
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
101102

102103
JniObjectReference.Dispose (ref reference, options);

src/Java.Interop/Java.Interop/JniObjectReferenceControlBlock.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ internal struct JniObjectReferenceControlBlock {
1111

1212
public static readonly int Size = Marshal.SizeOf<JniObjectReferenceControlBlock>();
1313

14-
public static unsafe JniObjectReferenceControlBlock* Alloc ()
14+
public static unsafe JniObjectReferenceControlBlock* Alloc (JniObjectReference reference)
1515
{
16-
return (JniObjectReferenceControlBlock*) NativeMemory.AllocZeroed (1, (uint) Size);
16+
var value = (JniObjectReferenceControlBlock*) NativeMemory.AllocZeroed (1, (uint) Size);
17+
value->handle = reference.Handle;
18+
value->handle_type = (int) reference.Type;
19+
return value;
1720
}
1821

1922
public static unsafe void Free (ref JniObjectReferenceControlBlock* value)

0 commit comments

Comments
 (0)