การสั่งการ 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 สาธารณะได้ คุณสามารถดูได้ในซอร์สโค้ดว่าจะตรวจสอบว่า bio แต่ละรายการไม่เป็นโมฆะหรือไม่ จากนั้นจึงปล่อยมันออกมา

แนวคิดหลักคือหลังจากที่คุณโทร 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 หรืออะไรก็ตามที่คุณตั้งชื่อฟังก์ชัน accessor สำหรับประวัติของคุณ

หากฉันต้องการมันเพื่อวัตถุประสงค์ในการดีบั๊กและไม่ใช่โค้ดที่ใช้งานจริง ฉันอาจจะแค่เข้าไปดูภายในของ ssl_st struct (SSL *) และทำให้ bios ทั้งหมดเป็นโมฆะก่อนที่จะเรียก SSL_set_bio แต่ฉันจะไม่ทำอย่างนั้นในโค้ดที่ใช้งานจริงเพราะเวอร์ชัน SSL ในอนาคตอาจทำให้โค้ดนั้นเสียหาย

person indiv    schedule 28.09.2011

คุณสามารถใช้ BIO_up_ref() เพื่อเพิ่มจำนวนการอ้างอิง BIO_free() จะลดจำนวนลง แต่ไม่ทำให้ว่าง

person J-16 SDiZ    schedule 28.04.2020
comment
คุณสามารถใช้สิ่งนี้เพื่อแชร์ BIO ส่วนกลางแบบคงที่ระหว่างการเชื่อมต่อทั้งหมดได้อย่างปลอดภัยหรือไม่ - person Gukki5; 01.09.2020