内核资源泄漏BIO_do_connect
Kernel Resource Leak BIO_do_connect
我需要以下方面的帮助;我试图寻找答案,但我不得不问。
检查员 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代码库质量的乐观态度是错误的。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- WinSock2:connect() 提供"连接被拒绝"
- 如何使用 do while 循环确定最高值和最低值
- 如何使用connect将qml按钮与同一类的cpp函数连接起来
- 在 QTextEdit 中使用指针或在 Qt-Creator 上使用 connect()
- do while 循环中的 if 语句以 yes 或 no 结尾
- 以某种方式告诉编译器"Do not process line of code"
- 在 C 或 C++ 中,循环可以同时具有 "do" 和"while"部分吗?
- 使用 while 或 do while 退出循环
- 带有开关语句的 do-while 循环 -- 无穷循环错误
- 为什么当我输入一个被接受的数字时,我的 do-while 循环没有中断?
- gnuradio c++ connect self() throw bad_weak_ptr
- 为什么我的 Do-while 循环无法在C++中运行菜单
- 如果语句不会在 do - while 循环中运行
- 开放CV垫"Sizes of input arguments do not match"的问题
- 如何将函数指针传递给方法,以便它可以在Qt的connect()中使用?
- 在CTOR vs Connect方法中提升套接字与stream_socket端点
- 为什么当我对数组使用增量操作时,do for 循环不起作用