C++ 指示OpenSSL在设置新BIO时不释放BIO对象
在此示例代码中:C++ 指示OpenSSL在设置新BIO时不释放BIO对象,c++,openssl,C++,Openssl,在此示例代码中: BIO *bio1 = BIO_new(BIO_s_mem()); BIO *bio2 = BIO_new(BIO_s_mem()); SSL_set_bio(ssl, bio1, bio1); SSL_set_bio(ssl, bio2, bio2); 最后一次调用SSL_set_bio会自动调用bio_free(bio1)。 是否有必要告诉OpenSSL不要这样做 我知道在使用bio_new(bio_s_mem())创建内存bio时,我可以告诉OpenSSL不要使用bio
BIO *bio1 = BIO_new(BIO_s_mem());
BIO *bio2 = BIO_new(BIO_s_mem());
SSL_set_bio(ssl, bio1, bio1);
SSL_set_bio(ssl, bio2, bio2);
最后一次调用SSL_set_bio会自动调用bio_free(bio1)。
是否有必要告诉OpenSSL不要这样做
我知道在使用bio_new(bio_s_mem())创建内存bio时,我可以告诉OpenSSL不要使用bio_set_close(bio,bio_NOCLOSE)释放它的内存缓冲区。我的情况是否与此类似?无法阻止
SSL\u set\u bio
在公共API中释放当前bio。您可以在源代码中看到,它只是检查每个bio是否为null,然后释放它
其主要思想是,在调用SSL\u set\u bio
之后,OpenSSL拥有bio并对其负责
void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio)
{
/* If the output buffering BIO is still in place, remove it
*/
if (s->bbio != NULL)
{
if (s->wbio == s->bbio)
{
s->wbio=s->wbio->next_bio;
s->bbio->next_bio=NULL;
}
}
if ((s->rbio != NULL) && (s->rbio != rbio))
BIO_free_all(s->rbio);
if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio))
BIO_free_all(s->wbio);
s->rbio=rbio;
s->wbio=wbio;
}
如果我有正当理由在生产代码中保留bio缓冲区,我会编写自己的bio并使用它。这并不像听起来那么难。只需复制/crypto/bio/bss_mem.c
,重命名函数和mem_方法
表,然后替换mem_free()的行为。然后,不使用BIO_s_mem
,而是通过BIO_custom_mem_BIO
或您为您的BIO命名的访问器函数
如果出于调试目的而不是为了生产代码而需要它,我可能只会潜入ssl\u st
结构(ssl*
)的内部,并在调用ssl\u set\u bio
之前将所有bios设为空。但我不会在生产代码中这样做,因为未来的SSL版本可能会破坏该代码。您可以使用BIO\u up\u ref()
来增加引用计数。
BIO_free()
会减少计数,但不会释放它。您能安全地使用它在所有连接之间共享静态全局BIOs吗?