gpt4 book ai didi

c++ - 内核资源泄漏 BIO_do_connect

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:19 25 4
gpt4 key购买 nike

我需要在以下方面提供帮助;我曾尝试寻找答案,但只剩下问了。

Inspector XE 给出了以下结果:线路上的内核资源泄漏

he=BIO_gethostbyname(str);

这一行是 OpenSSL 源代码的一部分,我无法想象这里有什么问题。

这个函数在内部调用:

BIO_do_connect();

我的代码是。

bio = BIO_new_connect(...);
if (BIO_do_connect(bio) != 1) { ... }
...
if (BIO_free(bio) != 0) { ... }

连接成功,唯一的错误发生在我与线程并发调用此函数 1,000 次时。

这个程序真的会导致内核资源泄漏吗?

最佳答案

BIO_gethostbyname 不是(不可能)线程安全的,因为它返回一个指向静态缓冲区的指针。事实上,在 openssl 的 bio.h 中提到了这一点,阅读

struct hostent *BIO_gethostbyname(const char *name);
/* We might want a thread-safe interface too:
* struct hostent *BIO_gethostbyname_r(const char *name,
* struct hostent *result, void *buffer, size_t buflen);
* or something similar (caller allocates a struct hostent,
* pointed to by "result", and additional buffer space for the various
* substructures; if the buffer does not suffice, NULL is returned
* and an appropriate error code is set).
*/

...但是,到目前为止,还没有 BIO_gethostbyname_r 函数实现,无论如何,如果它实现了而 BIO_do_connect 没有使用它,它也不会帮助您。

但不要绝望!这个函数调用周围有锁定代码,所以它(可能)可以工作。不过,有趣的是——锁定代码并不总是执行任何操作。我假设您没有使用 OPENSSL_NO_LOCKING 编译 OpenSSL,因为它不是默认设置,我无法想象任何人如果想开发多线程应用程序就会将它放入,所以我的猜测是你忘了打电话

CRYPTO_thread_setup();

在生成使用 OpenSSL 的线程之前。这很重要的原因是 CRYPTO_thread_setup 确实将函数指针设置为指向处理实际锁定的平台相关函数。如果未调用CRYPTO_thread_setup,则该指针保持为NULL,并且CRYPTO_lock(周围使用的宏底部的相关函数BIO_gethostbyname 调用)将默默地不做任何事情。据我所知,没有任何文档可以让您知道这一点。

可以说您对 OpenSSL 代码库质量的乐观是错误的。

关于c++ - 内核资源泄漏 BIO_do_connect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26993696/

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