int BIO_get_new_index(void);BIO_METHOD *BIO_meth_new(int类型,const char *name);
BIO_meth_new()创建了一个新的BIO_METHOD结构。应该给它一个唯一的整数type和一个表示它的name的字符串。使用BIO_get_new_index()获取type的值。
但是我找不到任何实际使用BIO_get_new_index()的示例代码!就连OpenSSL自己的例子也总是做一些临时的事情,比如
// test/sslcorrupttest.c
#define BIO_TYPE_CUSTOM_FILTER (0x80 | BIO_TYPE_FILTER)
[...]
method_tls_corrupt = BIO_meth_new(BIO_TYPE_CUSTOM_FILTER, "TLS corrupt filter");(在2016-08-19年添加到OpenSSL中,没有提交消息,也没有测试。)
在我自己的代码中,我直接使用了BIO_TYPE_FILTER或BIO_TYPE_SOURCE_SINK,如下所示:
BIO_METHOD *meth1 = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "StringBIO");
BIO_METHOD *meth2 = BIO_meth_new(BIO_TYPE_FILTER, "EavesdropBIO");我已经验证过,BIO_meth_new确实在每种情况下都返回一个新的BIO_METHOD*,所以它并不天真地使用提供的type作为全局表中的索引。示例:
BIO_METHOD *meth3 = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "StringBIO");
BIO_METHOD *meth4 = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "OtherBIO");
assert(meth3 != meth4);然而,我担心我正在做的事情可能是不安全的(我的意思是,比使用OpenSSL开始时更不安全;)。所以我有两个子问题:
BIO_meth_new(BIO_TYPE_SOURCE_SINK, ...),会有什么问题呢?换句话说,为什么OpenSSL决定在1.1.0中添加BIO_get_new_index()?BIO_get_new_index(),我应该如何使用它?是否打算使用现有的|宏进行BIO_TYPE_编辑,如下所示?如果我反复执行这些行,难道我不是在“泄漏”新索引吗?还是BIO_meth_free“释放”了新的索引以及释放了BIO_METHOD结构?
BIO_METHOD *meth1 = BIO_meth_new(BIO_get_new_index() x BIO_TYPE_SOURCE_SINK,"StringBIO");BIO_METHOD *meth2 = BIO_meth_new(BIO_get_new_index() x BIO_TYPE_FILTER,"EavesdropBIO");发布于 2020-05-20 18:23:21
(我不是OpenSSL开发人员,因此,请稍加考虑这个答案。)
如果我使用
BIO_meth_new(BIO_TYPE_SOURCE_SINK, ...),会有什么问题呢?
今天没有什么,但是:未来版本的OpenSSL有可能是内置生物类型的特例。OpenSSL源代码已经是特例,比如BIO_TYPE_SSL和BIO_TYPE_MEM。产生你自己的生物类型的未来-证明你的代码对抗这种恶作剧。
如果我应该使用
BIO_get_new_index(),我应该如何使用它?它是否打算用现有的|宏编辑.?
是的,它是用|编辑的,标志是BIO_TYPE_DESCRIPTOR、BIO_TYPE_FILTER和BIO_TYPE_SOURCE_SINK。其他类型(例如BIO_TYPE_SOCKET)是真正的类型,而不是标志。对于OpenSSL开发人员来说,这是一个非常糟糕的命名决定。在文档方面,BIO_find_type提到哪些“类型”是秘密标记。
如果我反复执行这些行,难道我不是在“泄漏”新索引吗?还是
BIO_meth_free“释放”了新的索引以及释放了BIO_METHOD结构?
是的,您将泄漏类型索引。BIO方法类型索引是一个有限的资源,可以获得,但不能释放:BIO_meth_free不“释放”索引,我也不知道任何其他过程。(您可能不认为类型索引是一种资源,因为BIO_get_new_index没有获得其他类型的资源,如内存或文件句柄,但我喜欢将“资源”视为一个非常普遍的概念)。
实际上,类型索引是非常有限的资源。类型标志从0x0100开始,所以在干扰标志之前可以创建的最大类型索引是0x00FF (即255)。更糟糕的是,BIO_get_new_index的索引从128开始。(在OpenSSL的未来版本中,有可能放宽这些限制。)
有个好消息:一旦你用BIO_meth_free发布了一个BIO方法,我怀疑你的应用程序可以自由地为不同的BIO方法重复使用它的索引。但是,您需要自己构建可用索引的空闲列表。这样做可能不值得;相反,编写应用程序时,您需要的生物方法的数量是一个小的编译时常量。不要在循环中分配新的。如果您正在编写库,则可能值得记录您的库使用了多少BIO类型索引。
https://stackoverflow.com/questions/59883179
复制相似问题