Из документов OpenSSL 1.1.0 :
int BIO_get_new_index(void);
BIO_METHOD *BIO_meth_new(int type, const char *name);
BIO_meth_new()
создает новую структуру BIO_METHOD
. Ему должно быть дано уникальное целое число type
и строка, представляющая его name
. Используйте BIO_get_new_index()
, чтобы получить значение для type
.
Но я не могу найти пример кода, который на самом деле использует BIO_get_new_index()
! Даже собственные примеры OpenSSL всегда делают ad-ho c такие вещи, как
// 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");
(BIO_get_new_index()
был добавлен в OpenSSL 2016-08-19 без сообщения о коммите и без тестов. )
В своем собственном коде я использовал 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 для начала;)). Итак, у меня есть два подвопроса:
Что может go не так, если я использую BIO_meth_new(BIO_TYPE_SOURCE_SINK, ...)
? Другими словами, почему OpenSSL решил добавить BIO_get_new_index()
в 1.1.0?
Если я должен использовать BIO_get_new_index()
, , как я должен использовать это? Он предназначен для |
редактирования с существующими макросами BIO_TYPE_
, как показано ниже [ниже]? Если я выполняю эти строки несколько раз, разве я не «пропускаю» новые индексы? или BIO_meth_free
"освобождает" новые индексы, а также освобождает структуру BIO_METHOD
?
BIO_METHOD *meth1 = BIO_meth_new(BIO_get_new_index() | BIO_TYPE_SOURCE_SINK, "StringBIO");
BIO_METHOD *meth2 = BIO_meth_new(BIO_get_new_index() | BIO_TYPE_FILTER, "EavesdropBIO");