【問題現(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)系。