奇怪的调用堆栈,在asio使用openssl时可能会出现问题吗?

时间:2020-03-06 14:30:36  来源:igfitidea点击:

我有这个奇怪的调用堆栈,我很困惑为什么会这样。

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

解决方案

快速浏览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);
}