c++ - 奇怪的调用栈,会不会是asio使用openssl的问题?

标签 c++ boost ssl openssl boost-asio

我有这个奇怪的调用堆栈,我很难理解为什么。

在我看来,asio 调用 open ssl 的 read,然后得到一个负返回值 (-37)。

Asio 似乎然后尝试在 memcpy 函数中使用它。

导致此调用堆栈的函数被使用了数百次而没有出现此错误。

这种情况很少发生,大约每周一次。

ulRead = (boost::asio::read(spCon->socket(), boost::asio::buffer(_requestHeader, _requestHeader.size()), boost::asio::transfer_at_least(_requestHeader.size()), error_));

请注意,请求 header 的大小始终正好是 3 个字节。

谁能阐明可能的原因?

注意:我使用的是 boost asio 1.36

这是由于巨大的“计数”而在 memcpy 中发生的崩溃调用堆栈崩溃:

最佳答案

快速查看 evp_lib.c 表明它试图从密码上下文中提取长度,在您的情况下得到一个非常糟糕的值 (tm)。然后它使用这个值来复制一个字符串(执行 memcpy)。我的猜测是有什么东西在破坏您的密码,无论是线程安全问题,还是向缓冲区中读取的字节数超过允许的字节数。

Relevant source :

int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
{
int i=0,j;

if (type != NULL)
    {
    j=EVP_CIPHER_CTX_iv_length(c);
    OPENSSL_assert(j <= sizeof c->iv);
    i=ASN1_TYPE_set_octetstring(type,c->oiv,j);
    }
return(i);
}

关于c++ - 奇怪的调用栈,会不会是asio使用openssl的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/111415/

相关文章:

没有 HTTP 的 SSL

c++ - Visual C++ 2015 中右值的非常量引用初始化无效

c++ - 在调用某些设备上下文函数时,我的一些 D3D11 对象将自己作为 ComPtr 清空

c++ - 在 C++ 中使用 C 库

c++ - bgl 中的 edge_descriptor 映射

java - 严重 : error registering connector Tomcat 5. 5

c++ - Linux - 找到g++ lib的路径

c++ - IP 网络中的动态松散源路由

c++ - Boost.Spirit气值序列 vector

c# - .net core在linux平台哪里搜索证书