GCHandle handle;
IntPtr context;
- IntPtr connectionId;
+
SslReadFunc readFunc;
SslWriteFunc writeFunc;
: base (parent, serverMode, targetHost, enabledProtocols,
serverCertificate, clientCertificates, askForClientCert)
{
- handle = GCHandle.Alloc (this);
- connectionId = GCHandle.ToIntPtr (handle);
+ handle = GCHandle.Alloc (this, GCHandleType.Weak);
readFunc = NativeReadCallback;
writeFunc = NativeWriteCallback;
var result = SSLSetIOFuncs (Handle, readFunc, writeFunc);
CheckStatusAndThrow (result);
- result = SSLSetConnection (Handle, connectionId);
+ result = SSLSetConnection (Handle, GCHandle.ToIntPtr (handle));
CheckStatusAndThrow (result);
if ((EnabledProtocols & SSA.SslProtocols.Tls) != 0)
[Mono.Util.MonoPInvokeCallback (typeof (SslReadFunc))]
static SslStatus NativeReadCallback (IntPtr ptr, IntPtr data, ref IntPtr dataLength)
{
- var handle = GCHandle.FromIntPtr (ptr);
- if (!handle.IsAllocated)
- return SslStatus.Internal;
+ AppleTlsContext context = null;
+ try {
+ var weakHandle = GCHandle.FromIntPtr (ptr);
+ if (!weakHandle.IsAllocated)
+ return SslStatus.Internal;
- var context = (AppleTlsContext) handle.Target;
- if (context.disposed)
- return SslStatus.ClosedAbort;
+ context = (AppleTlsContext) weakHandle.Target;
+ if (context == null || context.disposed)
+ return SslStatus.ClosedAbort;
- try {
return context.NativeReadCallback (data, ref dataLength);
} catch (Exception ex) {
- if (context.lastException == null)
+ if (context != null && context.lastException == null)
context.lastException = ex;
return SslStatus.Internal;
}
[Mono.Util.MonoPInvokeCallback (typeof (SslWriteFunc))]
static SslStatus NativeWriteCallback (IntPtr ptr, IntPtr data, ref IntPtr dataLength)
{
- var handle = GCHandle.FromIntPtr (ptr);
- if (!handle.IsAllocated)
- return SslStatus.Internal;
+ AppleTlsContext context = null;
+ try {
+ var weakHandle = GCHandle.FromIntPtr (ptr);
+ if (!weakHandle.IsAllocated)
+ return SslStatus.Internal;
- var context = (AppleTlsContext) handle.Target;
- if (context.disposed)
- return SslStatus.ClosedAbort;
+ context = (AppleTlsContext) weakHandle.Target;
+ if (context == null || context.disposed)
+ return SslStatus.ClosedAbort;
- try {
return context.NativeWriteCallback (data, ref dataLength);
} catch (Exception ex) {
- if (context.lastException == null)
+ if (context != null && context.lastException == null)
context.lastException = ex;
return SslStatus.Internal;
}