مكدس مكالمات غريب، هل يمكن أن يكون هناك مشكلة في استخدام asio لـ opensl؟

StackOverflow https://stackoverflow.com/questions/111415

سؤال

لدي مكدس مكالمات غريب وأنا في حيرة من أمري لفهم السبب.

يبدو لي أن 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top