【Freeswitch问题分析】 switch_rtp_add_dtls crash

【问题现象】
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库导致的。如果有遇到相同的,请私信联系。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、你在项目中用过 runtime 吗?举个例子。 a、Method Swizzling动态交换方法实现,实则交换...
    写代码的小农民阅读 1,438评论 0 4
  • (目前有点乱,先贴上来,等以后有时间在整理吧。这个问题一直想拿出来分享,还有两个博客,都是相关的,一点点发出来) ...
    kamiSDY阅读 4,549评论 0 2
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,630评论 0 4
  • zerotask ​ 拿到题目首先运行下,IDA打开分析main函数,可以看到有创建进程和删除进程的操作,一般...
    Nevv阅读 1,165评论 0 1
  • 我随手埋下的种子 长出一棵小小的桃树。 虽然这是我唯一的钱, 让我把它埋在土里吧...
    李贝贝_1703阅读 321评论 0 2

友情链接更多精彩内容