Skip to content

Commit 580df2e

Browse files
committed
Fixed potential issue with garbage collection of delegates in UnityTls binding
Before it might have happend that the garbage collector destroys delegates that we pass to native code.
1 parent 2195b96 commit 580df2e

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

mcs/class/System/Mono.UnityTls/UnityTlsContext.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ unsafe internal class UnityTlsContext : MobileTlsContext
3535
UnityTls.unitytls_x509list* requestedClientCertChain = null;
3636
UnityTls.unitytls_key* requestedClientKey = null;
3737

38+
// Delegates we passed to native to ensure they are not garbage collected
39+
UnityTls.unitytls_tlsctx_read_callback readCallback;
40+
UnityTls.unitytls_tlsctx_write_callback writeCallback;
41+
UnityTls.unitytls_tlsctx_trace_callback traceCallback;
42+
UnityTls.unitytls_tlsctx_certificate_callback certificateCallback;
43+
UnityTls.unitytls_tlsctx_x509verify_callback verifyCallback;
44+
3845
// States and certificates
3946
X509Certificate localClientCertificate;
4047
X509Certificate remoteCertificate;
@@ -68,9 +75,11 @@ public UnityTlsContext (
6875
max = UnityTlsConversions.GetMaxProtocol (enabledProtocols),
6976
};
7077

78+
readCallback = ReadCallback;
79+
writeCallback = WriteCallback;
7180
UnityTls.unitytls_tlsctx_callbacks callbacks = new UnityTls.unitytls_tlsctx_callbacks {
72-
write = WriteCallback,
73-
read = ReadCallback,
81+
write = writeCallback,
82+
read = readCallback,
7483
data = (void*)(IntPtr)handle,
7584
};
7685

@@ -104,15 +113,18 @@ public UnityTlsContext (
104113
tlsContext = UnityTls.NativeInterface.unitytls_tlsctx_create_client (protocolRange, callbacks, targetHostUtf8Ptr, targetHostUtf8.Length, &errorState);
105114
}
106115

107-
UnityTls.NativeInterface.unitytls_tlsctx_set_certificate_callback (tlsContext, CertificateCallback, (void*)(IntPtr)handle, &errorState);
116+
certificateCallback = CertificateCallback;
117+
UnityTls.NativeInterface.unitytls_tlsctx_set_certificate_callback (tlsContext, certificateCallback, (void*)(IntPtr)handle, &errorState);
108118
}
109119

110-
UnityTls.NativeInterface.unitytls_tlsctx_set_x509verify_callback (tlsContext, VerifyCallback, (void*)(IntPtr)handle, &errorState);
120+
verifyCallback = VerifyCallback;
121+
UnityTls.NativeInterface.unitytls_tlsctx_set_x509verify_callback (tlsContext, verifyCallback, (void*)(IntPtr)handle, &errorState);
111122

112123
Mono.Unity.Debug.CheckAndThrow (errorState, "Failed to create UnityTls context");
113124

114125
if (ActivateTracing) {
115-
UnityTls.NativeInterface.unitytls_tlsctx_set_trace_callback (tlsContext, TraceCallback, null, &errorState);
126+
traceCallback = TraceCallback;
127+
UnityTls.NativeInterface.unitytls_tlsctx_set_trace_callback (tlsContext, traceCallback, null, &errorState);
116128
Mono.Unity.Debug.CheckAndThrow (errorState, "Failed to set trace callback");
117129
}
118130

0 commit comments

Comments
 (0)