【問題現(xiàn)象】
freeswitch在使用tls通信時(shí)寥枝,每次第二次通話必然發(fā)生crash
【根因分析】
通過core堆椚鳎看到問題出在這里
第一次代碼也會(huì)走到這里峰尝,但是沒有問題养晋。
為何再第二次會(huì)crash呢衬吆?
我們首先在本地嘗試一下SSL_CTX_new,寫一個(gè)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é)束時(shí)會(huì)調(diào)用一些釋放資源的析構(gòu)函數(shù)。其中一個(gè)函數(shù)引起了我的注意:EVP_cleanup (中間省去介紹折騰該問題的過程)
再實(shí)踐一下
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;
}
但是這個(gè)問題不能解決根本問題,要找到哪里調(diào)用了EVP_cleanup()才是本質(zhì)原因四苇。
我這里的原因是因?yàn)槭褂昧薼ibwebsockets庫(kù)導(dǎo)致的孝凌。如果有遇到相同的,請(qǐng)私信聯(lián)系蛔琅。