2010-08-31 45 views
3

如果對SSL_accept的調用失敗,我只想保釋出來。如何清理糟糕的OpenSSL連接

目前我打電話給SSL_shutdown,然後是SSL_free,但是自從實現這個以來,兩位客戶在OpenSSL內部發生了崩潰(稍後調用SSL_accept時),所以我猜測這可能不是最好的清理方法。

該文檔說SSL_shutdown用於正確清理,它可能需要調用兩次(儘管如果SSL_accept失敗,我不認爲這將是這種情況)。 SSL_clear是另一種選擇,但它似乎更像是一個連接重置。

SSL_free遞減引用計數並在引用計數達到0時刪除連接。我知道我的代碼沒有任何引用,但'會話'可能?

使用OpenSSL完全關閉/關閉/釋放SSL對象是否存在確定的方法?

回答

3

一旦您在SSL對象上調用SSL_free(),就不應再使用它。您需要確保爲後續的SSL_accept()使用SSL_new()創建新的SSL。

+0

我絕對不會在調用SSL_free後重用SSL *。 所以一旦我打電話給SSL_free(),這就是我必須要清理它?不管以前發生過什麼錯誤或連接? – DougN 2010-09-01 22:15:05

+0

@DougN:正確。請注意,'SSL_free()'也釋放了底層的BIO - 這可能是你問題的根源嗎? – caf 2010-09-01 22:56:12

+0

我99%確定BIO沒有被釋放。據我所知,它只是SSL_shutdown,然後是SSL_free。然後再沒有任何東西被觸動猜猜我做的是對的(但會仔細檢查BIO) - 希望崩潰只是真相......感謝您的幫助。 – DougN 2010-09-02 12:58:36