OpenSSL Stack API - 推送到堆栈后释放对象
OpenSSL Stack API - Freeing objects after pushing to the stack
我试图了解在将对象推入STACK_OF(X509)
结构后是否需要释放X509
对象,或者sk_X509_free()
调用是否为我释放了包括内容在内的所有内容。我在OpenSSL中找不到这方面的文档。
std::vector<std::string> caPems;
// Fill the vector from input
// ...
BIO *bufio = NULL;
X509 *x509 = NULL, *x509_ca = NULL;
bool success = false;
STACK_OF(X509)* x509_ca_stack;
x509_ca_stack = sk_X509_new_null();
if (x509_ca_stack) {
success = true;
for (const std::string& caPem : caPems) {
BIO_new_mem_buf(caPem.c_str(), caPem.size());
PEM_read_bio_X509(bufio, &x509_ca, NULL, NULL);
BIO_free_all(bufio);
if (x509_ca != nullptr) {
sk_X509_push(x509_ca_stack, x509_ca);
x509_ca = NULL; // should I free after push???
} else
success = false;
}
if (success)
foo(x509_ca_stack);
sk_X509_free(x509_ca_stack); // or is this free enough for the entire stack?
} else {
printf("ERROR: failed loading certn");
}
编辑:瓦尔格林德没有帮助,当我自由时和我没有释放时,它都没有表现出任何帮助。
由于 openssl 1.1 X509(和许多其他)被计算在内。 sk_XXX_push() API不会自动递增引用,因此您在执行推送时会移交 X509 引用。因此,您的代码无效并且会按原样泄漏,因为 sk_X509_free() 不会减少内部 X509 的引用计数。
编辑:我更正了上述内容,我最初认为 sk_X509_free() 会自动释放引用。它没有。 从openssl 文档 https://www.openssl.org/docs/man1.1.0/man3/DEFINE_STACK_OF.html
sk_TYPE_free() 释放 sk 结构。它不会释放 sk 的任何元素。在此调用之后,sk 不再有效。
如果出于某种原因真的想创建 X509 的深层副本,可以使用 X509_dup() 复制 X509 对象并将其推送到堆栈中:
sk_X509_push(stack, X509_dup(cert));
在这种情况下,需要显式释放两个 X509 对象。
还可以使用sk_X509_pop_free(stack, X509_free)
自动取消引用所有堆栈元素并删除堆栈本身。
总之,您的代码可以通过两种方式修复:
- 在末尾添加 X509_free(),而不是紧接在 sk_X509_push() 之后
- 将 sk_X509_free() 替换为 sk_X509_pop_free()
相关文章:
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 未分配被释放的指针(将堆栈实现为链表时)
- OpenSSL Stack API - 推送到堆栈后释放对象
- C++ 从堆栈中释放 "_alloca" TED 内存
- 为什么不能在堆栈上释放变量?
- 释放自定义堆栈分配器中的内存
- 堆栈内存未释放
- 如何释放堆栈上的变量
- C++堆栈内存未释放
- WrapperPointer类和c++中堆栈分配对象的释放
- 从结构堆栈弹出时释放内存