我有这个奇怪的调用堆栈,我很难理解为什么。
在我看来,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)。我的猜测是有什么东西在破坏您的密码,无论是线程安全问题,还是向缓冲区中读取的字节数超过允许的字节数。
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/