مكدس مكالمات غريب، هل يمكن أن يكون هناك مشكلة في استخدام asio لـ opensl؟
-
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);
}