2008-09-21 2 views
1

J'ai cette pile d'appels étrange et je suis perplexe pour comprendre pourquoi.Étrange pile d'appel, pourrait-il être un problème dans l'utilisation d'openssl par asio?

Il me semble que les appels asio ouvrent ssl read et obtiennent une valeur de retour négative (-37). Asio semble ensuite essayer de l'utiliser dans la fonction memcpy.

La fonction qui provoque cette pile d'appels est utilisée des milliers de fois sans cette erreur.

Cela arrive rarement, environ une fois par semaine.

ulRead = (boost::asio::read(spCon->socket(), boost::asio::buffer(_requestHeader, _requestHeader.size()), boost::asio::transfer_at_least(_requestHeader.size()), error_)); 

Notez que la taille de l'en-tête de la requête est toujours de 3 octets.

Quelqu'un pourrait-il nous éclairer sur les raisons possibles?

Note: J'utilise boost asio 1,36

Voici le crash de la pile d'appel de plantage se produit dans memcpy à cause de l'énorme « count »:

+0

R. Bondy @ Brian: Est-il BIO_read retour -37? – user7116

+0

Je ne suis pas sûr à ce sujet, mais 4294967259 comme un nombre signé serait -37 –

+0

@Brian R. Bondy: Il semble que quelque chose de * mauvais * se produit dans _EVP_CIPHER_set_asn1_iv. Peut-être que les données quelque part se font lentement saccager (vous avez noté que cela arrive graduellement avec le temps). Finalement menant à la mort prématurée de memcpy. – user7116

Répondre

2

Un rapide coup d'oeil à evp_lib.c montre qu'il essaie tirer une longueur du contexte de chiffrement, et dans votre cas obtient une très mauvaise valeur (tm). Il utilise ensuite cette valeur pour copier une chaîne (qui fait le memcpy). Ma conjecture est que quelque chose détruit votre chiffre, que ce soit un problème de sécurité de thread, ou une lecture plus d'octets dans un tampon que permis.

Relevant source:

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); 
} 
+0

Je pense que je vais essayer de refactoriser l'utilisation du contexte SSL et voir si cela aide. Merci beaucoup pour votre aide. –

+0

@Brian R. Bondy: pas un problème, une vérification rapide serait de mettre quelque chose avant votre contexte sur la pile et voir si elle est saccagée à la place. – user7116