c++ - openssl 内存泄漏:我还是错误?
问题描述
尝试使用 openssl (1.0.2p) 解析证书中的信息,不能使其无泄漏。代码:
std::ifstream fst("2048b-rsa-example-cert.der", std::ios::binary);
std::vector<std::uint8_t> certificate((std::istreambuf_iterator<char>(fst)),
std::istreambuf_iterator<char>() );
const std::uint8_t* data = certificate.data();
X509 *info = d2i_X509(nullptr, &data, certificate.size());
X509_free(info);
证书示例: http: //fm4dd.com/openssl/certexamples.htm
最大的泄漏回溯:
==20846== at 0x4C2EEAF: malloc (vg_replace_malloc.c:299)
==20846== by 0x52380E7: CRYPTO_malloc (in /usr/lib64/libcrypto.so.1.0.0)
==20846== by 0x51BDF2F: lh_new (in /usr/lib64/libcrypto.so.1.0.0)
==20846== by 0x5239484: ex_data_check (in /usr/lib64/libcrypto.so.1.0.0)
==20846== by 0x5239544: def_get_class (in /usr/lib64/libcrypto.so.1.0.0)
==20846== by 0x5239FBA: int_new_ex_data (in /usr/lib64/libcrypto.so.1.0.0)
==20846== by 0x51DE8D3: x509_cb (in /usr/lib64/libcrypto.so.1.0.0)
==20846== by 0x51E28F8: asn1_item_ex_combine_new (in /usr/lib64/libcrypto.so.1.0.0)
==20846== by 0x51E55E8: asn1_item_ex_d2i (in /usr/lib64/libcrypto.so.1.0.0)
==20846== by 0x51E6224: ASN1_item_ex_d2i (in /usr/lib64/libcrypto.so.1.0.0)
==20846== by 0x51E627A: ASN1_item_d2i (in /usr/lib64/libcrypto.so.1.0.0)
==20846== by 0x109199: main (ssl.cpp:48)
平台:Linux
OpenSSL 1.0.2p 14 Aug 2018
built on: reproducible build, date unspecified
platform: linux-x86_64
options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: x86_64-pc-linux-gnu-gcc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -O2 -pipe -march=native -fno-strict-aliasing -Wa,--noexecstack
OPENSSLDIR: "/etc/ssl"
解决方案
OpenSSL库初始化wiki 提供了您可能需要调用以正确清理库的函数列表。据我所知,您的回溯中提到的字节/块没有泄漏,但它们在退出时仍在使用——尽管您没有提供所有输出。
对于这个片段,它看起来像添加
CRYPTO_cleanup_all_ex_data();
最后做的伎俩。valgrind
使用标志运行它--leak-check=full --show-leak-kinds=all
表明“退出时使用”的数量从 6 个块中的 416 个字节下降到 0 个块中的 0 个字节。
推荐阅读
- c++ - C++23中省略参数列表的lambda表达式的有效性
- javascript - 如何在字符串中找到最长的完全相同的字符块?
- php - php chat 显示所有消息
- python - 如何在单个单元格的 if 条件下使用 iloc?
- laravel - 基于Larave中输入的动态验证规则
- javascript - 如何用javascript中的图像替换彩色瓷砖?
- python - UnicodeDecodeError:“charmap”编解码器无法解码位置 113 中的字节 0x81:字符映射到
- html - 删除css中的边距
- php - 如何编辑这个 php 片段?
- python - 在python中增加一个字符串