博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenSSL中关于RSA_new和RSA_free的内存泄漏
阅读量:6935 次
发布时间:2019-06-27

本文共 2751 字,大约阅读时间需要 9 分钟。

在使用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 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->Detected memory leaks!Dumping objects ->{
140} normal block at 0x003B97A0, 12 bytes long. Data: < ; > B8 96 3B 00 00 00 00 00 06 00 00 00 {
139} normal block at 0x003B9750, 16 bytes long. Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 {
138} normal block at 0x003B9700, 20 bytes long. Data: < P ; > 00 00 00 00 50 97 3B 00 00 00 00 00 04 00 00 00 {
137} normal block at 0x003B96B8, 12 bytes long. Data: < ; > 06 00 00 00 00 97 3B 00 00 00 00 00 {
136} normal block at 0x003B9638, 64 bytes long. Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 {
135} normal block at 0x003B9598, 96 bytes long. Data: <8 ; A A > 38 96 3B 00 C0 FD 41 00 B0 FD 41 00 08 00 00 00 Object dump complete.
View Code

解决方法很简单:

调用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()的注释说明和代码如下:

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/* 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 confEVP_cleanup();                 //For EVPENGINE_cleanup();              //for engineCRYPTO_cleanup_all_ex_data();  //generic ERR_remove_state(0);           //for ERRERR_free_strings();            //for ERR

 

 

  // thread-local cleanup    ERR_remove_state(0);         // thread-safe cleanup    ENGINE_cleanup();    CONF_modules_unload(1);     // global application exit cleanup (after all SSL activity is shutdown)    ERR_free_strings();    EVP_cleanup();    CRYPTO_cleanup_all_ex_data();          // 这个函数是网上找的,描述说内存泄漏现象是 _comp_method(不知道有没有记错)对象没释放        // 额外添加的函数,用以释放资源(没有调用该函数,OpenSSL 会有内存泄漏(160字节))    SSL_free_comp_methods();

 

   月落上弦

转载于:https://www.cnblogs.com/coolYuan/p/8297693.html

你可能感兴趣的文章
iOS:NSFileHandle和NSFileManger的使用
查看>>
HTML5新特性之文件和二进制数据的操作
查看>>
Camtasia Studio CamStudio如何不录制鼠标
查看>>
内核源码阅读(三)进程命名空间和用户命名的实现
查看>>
redis两种持久化方式的优缺点
查看>>
腾讯2016笔试题-微信红包-找出数组中过半数的数字
查看>>
Vivado下生成及烧写MCS文件
查看>>
python基础技巧综合训练题1
查看>>
如何确定HyperThreading是否在Linux上已开启?
查看>>
线程调试
查看>>
Visual Studio 2015 和 Apache Cordova
查看>>
mysql之 innobackupex备份+binlog日志的完全恢复【转】
查看>>
Ubuntu下Ansible安装和使用
查看>>
【mybatis】mybatis中 的# 和 $的区别
查看>>
IDEA教程之导入maven项目
查看>>
nginx+jwplayer配置flv/MP4点播系统, 视频拖动支持
查看>>
phalcon: 解决php7/phalcon3.2以上版本,不支持oracle数据库的方法
查看>>
爬虫遇到的坑——发现你是爬虫抛出假数据
查看>>
PowerDesigner连接Oracle并导出表结构
查看>>
Mxnet学习资源
查看>>