1

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

在我看来,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_));

请注意,请求标头的大小始终为 3 个字节。

任何人都可以阐明可能的原因吗?

注意:我使用的是 boost asio 1.36

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

4

1 回答 1

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);
}
于 2008-09-21T17:27:34.117 回答