【Freeswitch問題分析】 switch_rtp_add_dtls crash

【問題現(xiàn)象】
freeswitch在使用tls通信時,每次第二次通話必然發(fā)生crash

【根因分析】
通過core堆??吹絾栴}出在這里


crash位置

第一次代碼也會走到這里,但是沒有問題。
為何再第二次會crash呢?

我們首先在本地嘗試一下SSL_CTX_new,寫一個demo

int main(int argc, char *argv[]) {
    SSL_CTX *ctx;
    SSL_library_init();
    ctx = SSL_CTX_new(DTLSv1_server_method());
    assert(ctx);
    return 0;
}

沒有問題。

查詢openssl示例代碼,發(fā)現(xiàn)結(jié)束時會調(diào)用一些釋放資源的析構(gòu)函數(shù)。其中一個函數(shù)引起了我的注意:EVP_cleanup (中間省去介紹折騰該問題的過程)

再實踐一下

int main(int argc, char *argv[]) {

    SSL_CTX *ctx;
    SSL_library_init();
    // 模擬第一次通信
    ctx = SSL_CTX_new(DTLSv1_server_method());
    assert(ctx);

    EVP_cleanup();
    // 模擬第二次通信
    ctx = SSL_CTX_new(DTLSv1_server_method());
    assert(ctx);

    return 0;
}

結(jié)果在第二次ctx返回為NULL。
發(fā)現(xiàn)問題就是調(diào)用了EVP_cleanup

如果解決(規(guī)避)呢?

int main(int argc, char *argv[]) {

    SSL_CTX *ctx;

    SSL_library_init();


    ctx = SSL_CTX_new(DTLSv1_server_method());
    assert(ctx);

    EVP_cleanup();

    // 釋放后需要重新調(diào)用init
    SSL_library_init();
    ctx = SSL_CTX_new(DTLSv1_server_method());
    assert(ctx);

    return 0;
}

但是這個問題不能解決根本問題,要找到哪里調(diào)用了EVP_cleanup()才是本質(zhì)原因。

我這里的原因是因為使用了libwebsockets庫導(dǎo)致的。如果有遇到相同的,請私信聯(lián)系。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、你在項目中用過 runtime 嗎?舉個例子。 a、Method Swizzling動態(tài)交換方法實現(xiàn),實則交換...
    寫代碼的小農(nóng)民閱讀 1,450評論 0 4
  • (目前有點亂,先貼上來,等以后有時間在整理吧。這個問題一直想拿出來分享,還有兩個博客,都是相關(guān)的,一點點發(fā)出來) ...
    kamiSDY閱讀 4,565評論 0 2
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,689評論 0 4
  • zerotask ? 拿到題目首先運行下,IDA打開分析main函數(shù),可以看到有創(chuàng)建進程和刪除進程的操作,一般...
    Nevv閱讀 1,169評論 0 1
  • 我隨手埋下的種子 長出一棵小小的桃樹。 雖然這是我唯一的錢, 讓我把它埋在土里吧...
    李貝貝_1703閱讀 334評論 0 2

友情鏈接更多精彩內(nèi)容