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

发布于 2024-07-05 08:44:10 字数 523 浏览 7 评论 0原文

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

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

I have this strange call stack and I am stumped to understand why.

It seems to me that asio calls open ssl's read and then gets a negative return value (-37) .

Asio seems to then try to use it inside the memcpy function.

The function that causes this call stack is used hunderds of thousands of times without this error.

It happens only rarely, about once a week.

ulRead = (boost::asio::read(spCon->socket(), boost::asio::buffer(_requestHeader, _requestHeader.size()), boost::asio::transfer_at_least(_requestHeader.size()), error_));

Note that request header's size is exactly 3 bytes always.

Could anyone shed some light on possible reasons?

Note: I'm using boost asio 1.36

Here is the crashing call stack crash happens in memcpy because of the huge "count":

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

留蓝 2024-07-12 08:44:10

快速查看 evp_lib.c 会发现它试图从密码上下文中提取一定长度,在您的情况下会得到一个 Very Bad Value(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);
}

A quick look at evp_lib.c shows that it tries to pull a length from the cipher context, and in your case gets a Very Bad Value(tm). It then uses this value to copy a string (which does the memcpy). My guess is something is trashing your cipher, be it a thread safety problem, or a reading more bytes into a buffer than allowed.

Relevant source:

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文