内核资源泄漏BIO_do_connect

Kernel Resource Leak BIO_do_connect

本文关键字:do connect BIO 资源 泄漏 内核      更新时间:2023-10-16

我需要以下方面的帮助;我试图寻找答案,但我不得不问。

检查员 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代码库质量的乐观态度是错误的。