SM2第二十一篇:OpenSSL中关于RSA_new和RSA_free的内存泄漏(CRYPTO_cleanup_all_ex_data)
2016-05-21 00:11
507 查看
在使用OpenSSL的RSA加解密的时候,发现RSA_new()初始化和RSA_free()释放RSA结构体后依然会有内存泄漏。网上Baidu、Google之,发现
这个相关信息很少(至少中文搜索结果是这样,不知是研究这个的人太少还是这个太基础了。。。),最后终于在某个E文论坛上找到了解决办
法。在这里总结了一下,供大家参考。我的OpenSSL版本是0.9.8l。(by 月落上弦)
具体如下:
RSA * rsa = RSA_new();
RSA_free( rsa );
产生内存泄漏:
Debug
for memory leaks
解决方法很简单:
调用OpenSSL的crypto库,在退出前需要调用API "CRYPTO_cleanup_all_ex_data",清除管理CRYPTO_EX_DATA的全局hash表中的数据,避免
内存泄漏。如下:
RSA * rsa = RSA_new();
RSA_free( rsa );
CRYPTO_cleanup_all_ex_data();
这样就没有内存泄漏了。
需要注意的是,CRYPTO_cleanup_all_ex_data()不能在potential race-conditions条件在调用(不太懂这个术语,我理解的意思是当函数外部存在
RSA结构体的时候,在函数内部执行CRYPTO_cleanup_all_ex_data()将导致函数外的RSA结构体也被清理掉),因此最好在程序结束的时候才调
用。
关于CRYPTO_cleanup_all_ex_data()的注释说明和代码如下:
/* Release all "ex_data" state to prevent memory leaks. This can't be made
* thread-safe without overhauling a lot of stuff, and shouldn't really be
* called under potential race-conditions anyway (it's for program shutdown
* after all). */
void CRYPTO_cleanup_all_ex_data(void)
{
IMPL_CHECK
EX_IMPL(cleanup)();
}
同样,其他相应的模块也需要在使用后清理:
CONF_modules_unload(1); //for conf
EVP_cleanup(); //For EVP
ENGINE_cleanup(); //for engine
CRYPTO_cleanup_all_ex_data(); //generic
ERR_remove_state(0); //for ERR
ERR_free_strings(); //for ERR
http://www.cnblogs.com/moonset7/archive/2009/12/30/1635770.html 月落上弦
这个相关信息很少(至少中文搜索结果是这样,不知是研究这个的人太少还是这个太基础了。。。),最后终于在某个E文论坛上找到了解决办
法。在这里总结了一下,供大家参考。我的OpenSSL版本是0.9.8l。(by 月落上弦)
具体如下:
RSA * rsa = RSA_new();
RSA_free( rsa );
产生内存泄漏:
Debug
for memory leaks
解决方法很简单:
调用OpenSSL的crypto库,在退出前需要调用API "CRYPTO_cleanup_all_ex_data",清除管理CRYPTO_EX_DATA的全局hash表中的数据,避免
内存泄漏。如下:
RSA * rsa = RSA_new();
RSA_free( rsa );
CRYPTO_cleanup_all_ex_data();
这样就没有内存泄漏了。
需要注意的是,CRYPTO_cleanup_all_ex_data()不能在potential race-conditions条件在调用(不太懂这个术语,我理解的意思是当函数外部存在
RSA结构体的时候,在函数内部执行CRYPTO_cleanup_all_ex_data()将导致函数外的RSA结构体也被清理掉),因此最好在程序结束的时候才调
用。
关于CRYPTO_cleanup_all_ex_data()的注释说明和代码如下:
/* Release all "ex_data" state to prevent memory leaks. This can't be made
* thread-safe without overhauling a lot of stuff, and shouldn't really be
* called under potential race-conditions anyway (it's for program shutdown
* after all). */
void CRYPTO_cleanup_all_ex_data(void)
{
IMPL_CHECK
EX_IMPL(cleanup)();
}
同样,其他相应的模块也需要在使用后清理:
CONF_modules_unload(1); //for conf
EVP_cleanup(); //For EVP
ENGINE_cleanup(); //for engine
CRYPTO_cleanup_all_ex_data(); //generic
ERR_remove_state(0); //for ERR
ERR_free_strings(); //for ERR
http://www.cnblogs.com/moonset7/archive/2009/12/30/1635770.html 月落上弦
相关文章推荐
- OpenSSL编程之RSA
- 每 172 个活动 RSA 证书中就有一个容易受到攻击
- 怎样安装openssl 2011-12-11
- c语言内存泄露示例解析
- 如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
- C#自定义RSA加密解密及RSA签名和验证类实例
- 解决js函数闭包内存泄露问题的办法
- IE下使用jQuery重置iframe地址时内存泄露问题解决办法
- Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍
- linux openssl基础介绍
- Android App调试内存泄露之Cursor篇
- 使用openssl实现rsa非对称加密算法示例
- js内存泄露的几种情况详细探讨
- Javascript 闭包引起的IE内存泄露分析
- openSUSE下的Ruby安装openssl出错解决方法
- JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
- 深入解析PHP垃圾回收机制对内存泄露的处理
- PHP脚本内存泄露导致Apache频繁宕机解决方法
- Nginx基础应用--------基于CentOS6源码安装