首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指示OpenSSL在设置新的BIO时不释放BIO对象

指示OpenSSL在设置新的BIO时不释放BIO对象
EN

Stack Overflow用户
提问于 2011-09-26 19:46:29
回答 2查看 1.5K关注 0票数 2

在此示例代码中:

代码语言:javascript
复制
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)释放它的内存缓冲区。我的情况有没有类似的东西?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-28 12:42:03

没有办法阻止SSL_set_bio在公共API中释放当前的BIO。您可以在源代码中看到,它只是检查每个bio是否不为空,然后释放它。

主要思想是,在您调用SSL_set_bio之后,OpenSSL拥有并负责BIO。

代码语言:javascript
复制
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并使用它。这并不像听起来那么难。只需复制<openssl source>/crypto/bio/bss_mem.c,重命名functions和mem_method表,然后替换mem_free()的行为。然后,不传递BIO_s_mem,而是传递BIO_custom_mem_bio或您为您的bio命名的访问器函数。

如果我需要它来进行调试,而不是为了生产代码,那么在调用SSL_set_bio之前,我可能会低头钻研ssl_st结构(SSL *)的内部结构,并将所有的bios设为空。但我不会在生产代码中这样做,因为将来的SSL版本可能会破坏该代码。

票数 1
EN

Stack Overflow用户

发布于 2020-04-28 14:46:40

您可以使用BIO_up_ref()来增加引用计数。BIO_free()会减少计数,但不会释放它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7554583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档