Skip to content

Commit b0a926d

Browse files
authored
Merge pull request #1038 from Unity-Technologies/unity-master-fix-potential-gc-issue-with-tls-callbacks
Fixed potential issue with garbage collection of delegates in UnityTls
2 parents 2195b96 + 580df2e commit b0a926d

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)