Странный стек вызовов, может ли быть проблема в использовании openssl asio? - PullRequest
1 голос
/ 21 сентября 2008

У меня странный стек вызовов, и я не понимаю, почему.

Мне кажется, что 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 из-за огромного «количества»:

1 Ответ

2 голосов
/ 21 сентября 2008

Быстрый просмотр 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);
}
...