2010-08-31 113 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