OpenSSL内存泄漏:是我还是程序的错误?

4

尝试使用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"

需要一些平台信息。我刚在运行1.0.2l的osx(高西拉)上完成了这个(是的,它有点旧;抱歉),并且没有任何泄漏表现。编辑:升级到1.0.2p;仍然没有泄漏(Valgrind-3.14.0)。 - WhozCraig
edited: Added platform info. - serafean
你确定这不是某个库缓冲区根本不会被释放吗?也就是说,泄漏是否在增长? - hyde
是的,它会随着每个d2i_X509/X509_free组合而增长。 - serafean
算了,有一个错误的指针,它不增长。可能确实是库缓冲区的问题... - serafean
1个回答

2
OpenSSL 库初始化 维基页面提供了一个函数列表,你可能需要调用这些函数来正确清理库。据我所知,你的回溯中提到的字节/块没有泄漏,但它们在退出时仍在使用 -- 不过你并没有提供全部输出。

对于这段代码,看起来添加以下代码会有帮助:

CRYPTO_cleanup_all_ex_data();

最后的技巧起了作用。使用带有标志--leak-check=full --show-leak-kinds=allvalgrind运行它,可以看到“退出时使用”的数量从6个块中的416字节下降到0个块中的0字节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接