указание OpenSSL не освобождать объект BIO при установке нового BIO - PullRequest
2 голосов
/ 26 сентября 2011

В этом примере кода:

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).Есть ли что-нибудь похожее для моего случая?

1 Ответ

1 голос
/ 28 сентября 2011

Нет способа помешать 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 struct (SSL *) и сделать все bios NULL перед вызовом SSL_set_bio.Но я бы не стал этого делать в рабочем коде, потому что будущие версии SSL могут нарушить этот код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...