указание OpenSSL не освобождать объект BIO при установке нового 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()) я могу указать OpenSSL не освобождать буфер памяти с помощью BIO_set_close(bio, BIO_NOCLOSE). Есть ли что-то подобное для моего случая?


person user864940    schedule 26.09.2011    source источник


Ответы (2)


Невозможно запретить SSL_set_bio освобождать текущий BIO в общедоступном API. Вы можете видеть в исходном коде, что он просто проверяет, не является ли каждая биография нулевой, а затем освобождает ее.

Основная идея заключается в том, что после вызова 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;
        }

Если бы у меня была законная причина сохранить биобуфер в производственном коде, я бы написал свою собственную биографию и использовал ее. Это не так сложно, как кажется. Просто скопируйте <openssl source>/crypto/bio/bss_mem.c, переименуйте функции и таблицу mem_method, а затем замените поведение mem_free(). Затем вместо BIO_s_mem передайте BIO_custom_mem_bio или как вы назовете функцию доступа к своей биографии.

Если бы мне это было нужно для целей отладки, а не для производственного кода, я бы, вероятно, просто проникся внутренностями структуры ssl_st (SSL *) и сделал все биосы NULL перед вызовом SSL_set_bio. Но я бы не стал делать это в рабочем коде, потому что будущие версии SSL могут сломать этот код.

person indiv    schedule 28.09.2011

Вы можете использовать BIO_up_ref() для увеличения счетчика ссылок. BIO_free() уменьшит количество, но не освободит его.

person J-16 SDiZ    schedule 28.04.2020
comment
можете ли вы безопасно использовать это для обмена статическими глобальными биосами между всеми соединениями? - person Gukki5; 01.09.2020