mengarahkan OpenSSL untuk tidak membebaskan objek BIO saat menyetel BIO baru

Dalam kode contoh ini:

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);

panggilan terakhir ke SSL_set_bio secara otomatis memanggil BIO_free(bio1). Apakah ada cara untuk memberitahu OpenSSL agar tidak melakukannya?

Saya tahu bahwa setelah membuat bio memori dengan BIO_new(BIO_s_mem()) saya dapat memberi tahu OpenSSL untuk tidak mengosongkan buffer memorinya dengan BIO_set_close(bio, BIO_NOCLOSE). Apakah ada hal serupa untuk kasus saya?


person user864940    schedule 26.09.2011    source sumber


Jawaban (2)


Tidak ada cara untuk mencegah SSL_set_bio membebaskan BIO saat ini di API publik. Anda dapat melihat di kode sumber bahwa ia hanya memeriksa apakah setiap bio tidak null dan kemudian membebaskannya.

Ide utamanya adalah setelah Anda memanggil SSL_set_bio, OpenSSL memiliki BIO dan bertanggung jawab atasnya.

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;
        }

Jika saya memiliki alasan yang sah untuk menyimpan buffer bio dalam kode produksi, saya akan menulis bio saya sendiri dan menggunakannya. Ini tidak sesulit kedengarannya. Cukup salin <openssl source>/crypto/bio/bss_mem.c, ganti nama fungsi dan tabel mem_method, lalu ganti perilaku mem_free(). Lalu alih-alih BIO_s_mem, berikan BIO_custom_mem_bio atau apa pun nama fungsi pengakses untuk bio Anda.

Jika saya membutuhkannya untuk tujuan debugging dan bukan kode produksi, saya mungkin akan merendahkan diri ke dalam internal ssl_st struct (SSL *) dan menjadikan semua bios NULL sebelum memanggil SSL_set_bio. Tapi saya tidak akan melakukan itu dalam kode produksi karena versi SSL di masa depan mungkin merusak kode itu.

person indiv    schedule 28.09.2011

Anda dapat menggunakan BIO_up_ref() untuk menambah jumlah referensi. BIO_free() akan mengurangi hitungannya, tetapi tidak membebaskannya.

person J-16 SDiZ    schedule 28.04.2020
comment
dapatkah Anda menggunakan ini dengan aman untuk berbagi BIO global statis di antara semua koneksi? - person Gukki5; 01.09.2020