SM2第二十一篇:OpenSSL中关于RSA_new和RSA_free的内存泄漏(CRYPTO_cleanup_all_ex_data)
来源:互联网 发布:淘宝网店实名认证照片 编辑:程序博客网 时间:2024/03/29 04:07
在使用OpenSSL的RSA加解密的时候,发现RSA_new()初始化和RSA_free()释放RSA结构体后依然会有内存泄漏。网上Baidu、Google之,发现
这个相关信息很少(至少中文搜索结果是这样,不知是研究这个的人太少还是这个太基础了。。。),最后终于在某个E文论坛上找到了解决办
法。在这里总结了一下,供大家参考。我的OpenSSL版本是0.9.8l。(by 月落上弦)
具体如下:
RSA * rsa = RSA_new();
RSA_free( rsa );
产生内存泄漏:
解决方法很简单:
调用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()的注释说明和代码如下:
* 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)();
}
同样,其他相应的模块也需要在使用后清理:
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 月落上弦
- SM2第二十一篇:OpenSSL中关于RSA_new和RSA_free的内存泄漏(CRYPTO_cleanup_all_ex_data)
- SM2算法第二十六篇:openSSL 中BIGNUM的使用记录
- SM2算法第二十三篇:openssl库中BIGNUM的使用
- 一篇关于java内存泄漏很好的文章
- (转载)Java中关于内存泄漏出现的原因以及如何避免内存泄漏
- 关于ie中jscript的内存泄漏
- SM2算法第二十四篇:谈谈PBOC3.0中使用的国密SM2算法
- 第二十一篇:OpenCV中Adaboost训练的经验总结
- SM2算法第二十七篇: openssl库中的BIGNUM(超赞)
- SM2算法第二十八篇:Openssl有关大数运算函数介绍(全面)
- Java中关于内存泄漏出现的原因以及如何避免内存泄漏(超详细版汇总上)
- Java中关于内存泄漏出现的原因以及如何避免内存泄漏(超详细版)
- Java中关于内存泄漏出现的原因以及如何避免内存泄漏(超详细版汇总下)
- Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)
- Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)
- Java中关于内存泄漏出现的原因以及如何避免内存泄漏(超详细版汇总上)
- 关于Android中的内存溢出和内存泄漏的问题
- 关于内存泄漏和内存分析检测的简单描述
- 编译模块时遇到Invalid module format
- 动态规划-3003-序列的最大上升子序列
- SourceInsight代码工程
- 统计学 入门基础概念篇 - Descriptive Statistics: Quantitative Measures(个人笔记)
- 环境变量的访问及设置
- SM2第二十一篇:OpenSSL中关于RSA_new和RSA_free的内存泄漏(CRYPTO_cleanup_all_ex_data)
- echo命令的-n、-e两个参数
- 【java并发】传统线程技术中创建线程的两种方式
- 数据结构实验之二叉树二:遍历二叉树
- assign weak retain strong copy关键字的区别
- UVA 11183 Teen Girl Squad(最小树形图裸题)
- Spring+Hibernate多数据源配置
- 【C语言】有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student"
- 静态顺序表的实现创建、查找、删除