Странный стек вызовов, может ли это быть проблемой при использовании openssl в asio?
-
02-07-2019 - |
Вопрос
У меня есть этот странный стек вызовов, и я не могу понять, почему.
Мне кажется, что 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);
}