在此示例代码中:
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())创建内存生物时,我可以告诉OpenSSL不要使用BIO_set_close(bio,BIO_NOCLOSE)释放它的内存缓冲区。我的情况有什么相似之处吗?
答案 0 :(得分:1)
无法阻止SSL_set_bio
释放公共API中的当前BIO。您可以在源代码中看到它只是检查每个bio是否为null然后释放它。
主要的想法是,在您致电SSL_set_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;
}
如果我有合理的理由在生产代码中保留生物缓冲液,我会编写自己的生物并使用它。它并不像听起来那么难。只需复制<openssl source>/crypto/bio/bss_mem.c
,重命名函数和mem_method
表,然后替换mem_free()
的行为。然后,而不是BIO_s_mem
,传递BIO_custom_mem_bio
或任何你为你的生物命名的访问者函数。
如果我需要它用于调试目的而不是生产代码,我可能只需要了解ssl_st
struct(SSL *
)的内部结构,并在调用{{1}之前使所有bios为NULL }}。但我不会在生产代码中这样做,因为未来的SSL版本可能会破坏该代码。
答案 1 :(得分:0)
您可以使用BIO_up_ref()
来增加引用计数。
BIO_free()
会减少计数,但不会释放计数。