【Freeswitch问题分析】 switch_rtp_add_

2020-03-03  本文已影响0人  安安爸Chris

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

上一篇 下一篇

猜你喜欢

热点阅读