繁体   English   中英

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

[英]directing OpenSSL not to free a BIO object upon setting a new 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_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;
        }

如果我有正当理由在生产代码中保留 bio 缓冲区,我会编写自己的 bio 并使用它。 这并不像听起来那么难。 只需复制<openssl source>/crypto/bio/bss_mem.c ,重命名函数和mem_method表,然后替换mem_free()的行为。 然后,而不是BIO_s_mem ,传递BIO_custom_mem_bio或任何您为您的 bio 命名访问器函数的名称。

如果我需要它用于调试目的而不是生产代码,我可能只是深入了解ssl_st结构( SSL * )的内部结构,并在调用SSL_set_bio之前将所有 bios SSL_set_bio NULL。 但我不会在生产代码中这样做,因为未来的 SSL 版本可能会破坏该代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM