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

在我看来,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中发生崩溃的调用堆栈崩溃:

有帮助吗?

解决方案

快速查看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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top