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吗?