From 5f56ee2d2c260f61e2e96c256524dc642f3374bd Mon Sep 17 00:00:00 2001 From: clowwindy Date: Thu, 6 Nov 2014 01:10:03 +0800 Subject: [PATCH] only close once --- .../Encrypt/PolarSSLEncryptor.cs | 49 +++++++++++++++++++ shadowsocks-csharp/Local.cs | 6 +++ 2 files changed, 55 insertions(+) diff --git a/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs b/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs index d1a3a78f..966f5ac4 100755 --- a/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs +++ b/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs @@ -211,9 +211,58 @@ namespace shadowsocks_csharp.Encrypt } } + #region IDisposable + private bool _disposed; public override void Dispose() { + Dispose(true); + GC.SuppressFinalize(this); } + + ~PolarSSLEncryptor() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposed) + { + if (disposing) + { + + } + + if (_encryptCtx != null) + { + switch (_cipher) + { + case CIPHER_AES: + PolarSSL.aes_free(_encryptCtx); + break; + case CIPHER_RC4: + PolarSSL.arc4_free(_encryptCtx); + break; + } + } + if (_decryptCtx != null) + { + switch (_cipher) + { + case CIPHER_AES: + PolarSSL.aes_free(_decryptCtx); + break; + case CIPHER_RC4: + PolarSSL.arc4_free(_decryptCtx); + break; + } + } + _encryptCtx = null; + _decryptCtx = null; + _disposed = true; + } + } + #endregion } } diff --git a/shadowsocks-csharp/Local.cs b/shadowsocks-csharp/Local.cs index eabae01c..0ad8b6b7 100755 --- a/shadowsocks-csharp/Local.cs +++ b/shadowsocks-csharp/Local.cs @@ -112,6 +112,7 @@ namespace shadowsocks_csharp public byte[] connetionSendBuffer = new byte[BufferSize]; // Received data string. public StringBuilder sb = new StringBuilder(); + private bool closed = false; public void Start() { @@ -144,6 +145,11 @@ namespace shadowsocks_csharp public void Close() { + if (closed) + { + return; + } + closed = true; if (connection != null) { try