1

この奇妙な呼び出しスタックがあり、その理由を理解するのに困惑しています。

asio が open ssl の read を呼び出してから、負の戻り値 (-37) を取得しているように思えます。

その後、Asio は memcpy 関数内で使用しようとしているようです。

このコール スタックを引き起こす関数は、このエラーなしで何十万回も使用されます。

まれに、週に1回程度です。

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 で発生するクラッシュ コール スタック クラッシュです。

4

1 に答える 1

2

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);
}
于 2008-09-21T17:27:34.117 に答える