美文网首页
【Freeswitch问题分析】 switch_rtp_add_

【Freeswitch问题分析】 switch_rtp_add_

作者: 安安爸Chris | 来源:发表于2020-03-03 15:43 被阅读0次

【问题现象】
freeswitch在使用tls通信时,每次第二次通话必然发生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示例代码,发现结束时会调用一些释放资源的析构函数。其中一个函数引起了我的注意: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;
}

结果在第二次ctx返回为NULL。
发现问题就是调用了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();

    // 释放后需要重新调用init
    SSL_library_init();
    ctx = SSL_CTX_new(DTLSv1_server_method());
    assert(ctx);

    return 0;
}

但是这个问题不能解决根本问题,要找到哪里调用了EVP_cleanup()才是本质原因。

我这里的原因是因为使用了libwebsockets库导致的。如果有遇到相同的,请私信联系。

相关文章

网友评论

      本文标题:【Freeswitch问题分析】 switch_rtp_add_

      本文链接:https://www.haomeiwen.com/subject/tlrhlhtx.html