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