gpt4 book ai didi

c++ - OpenSSL Stack API - 推送到堆栈后释放对象

转载 作者:行者123 更新时间:2023-12-05 05:12:18 24 4
gpt4 key购买 nike

我试图了解在将 X509 对象插入 STACK_OF(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 cert\n");
}

编辑:valgrind 没有帮助,当我释放和不释放时它都没有显示。

最佳答案

自 openssl 1.1 X509(以及许多其他版本)以来都是引用计数。sk_XXX_push() API NOT 会自动增加引用,因此您在进行推送时会移交 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() frees up the sk structure. It does not free up any elements of sk. After this call sk is no longer valid.

如果出于某种原因真的想要创建 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_pop_free() 替换 sk_X509_free()

关于c++ - OpenSSL Stack API - 推送到堆栈后释放对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54724908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com