Welcome to Snooda's Blog
libcurl和openssl的冲突和资源释放问题-curl_global_cleanup
[| 2014/09/26 00:59]
最近程序发现了个奇葩现象,即从文件载入的证书链用openssl校验是通过的,而用curl远程获取的就校验失败,错误码7。而这些内容写入文件在下一次程序启动时载入校验,又是成功的。
排查了各种内存泄露、不可见字符的可能性后。突然想起来是不是libcurl静态链接了openssl跟主程序动态链接的打架。查看后发现libcurl未静态链接openssl。
不过这也是一个启示。想起来既然curl也用到了openssl,那么它在最后cleanup的时候会不会把全局的openssl数据结构给释放掉。
尝试了一下,果然好了。原来我在一个函数里开头调用curl_global_init,结尾调用curl_global_cleanup。这样的话在程序结束时就会释放openssl的全局数据结构。导致后续调用证书校验报错。
不过openssl也不够友好,报证书签名错误,让人很难联想到是初始化问题。
不过aes加密部分并不受这个影响。
排查了各种内存泄露、不可见字符的可能性后。突然想起来是不是libcurl静态链接了openssl跟主程序动态链接的打架。查看后发现libcurl未静态链接openssl。
不过这也是一个启示。想起来既然curl也用到了openssl,那么它在最后cleanup的时候会不会把全局的openssl数据结构给释放掉。
尝试了一下,果然好了。原来我在一个函数里开头调用curl_global_init,结尾调用curl_global_cleanup。这样的话在程序结束时就会释放openssl的全局数据结构。导致后续调用证书校验报错。
不过openssl也不够友好,报证书签名错误,让人很难联想到是初始化问题。
不过aes加密部分并不受这个影响。