我有这个奇怪的调用堆栈,我很难理解为什么。
在我看来,asio调用open ssl的读取然后获得负的返回值(-37)。
Asio似乎试图在memcpy函数中使用它。
导致此调用堆栈的函数被使用数千次,没有此错误。
它很少发生,大约每周一次。
ulRead = (boost::asio::read(spCon->socket(), boost::asio::buffer(_requestHeader, _requestHeader.size()), boost::asio::transfer_at_least(_requestHeader.size()), error_));
请注意,请求标头的大小始终为3个字节。
有人可以说明可能的原因吗?
注意:我正在使用boost asio 1.36
由于巨大的“计数”,以下是memcpy中发生崩溃的调用堆栈崩溃:
答案 0 :(得分:2)
快速查看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);
}