奇怪的调用堆栈,在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); }