Domanda

Ho questo strano stack di chiamate e sono sconcertato per capire il perché.

Mi sembra che Asio chiami open ssl's read e quindi ottenga un valore di ritorno negativo (-37).

Asio sembra quindi provare ad usarlo all'interno della funzione memcpy.

La funzione che causa questo stack di chiamate viene utilizzata centinaia di volte senza questo errore.

Succede solo raramente, circa una volta alla settimana.

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

Nota che la dimensione dell'intestazione della richiesta è sempre esattamente di 3 byte.

Qualcuno potrebbe fare luce su possibili ragioni?

Nota: sto usando boost asio 1.36

Ecco l'arresto anomalo dello stack di chiamate che si verifica in memcpy a causa dell'enorme "quotazione":

È stato utile?

Soluzione

Una rapida occhiata a evp_lib.c mostra che tenta di estrarre una lunghezza dal contesto di cifratura e nel tuo caso ottiene un valore pessimo (tm). Quindi utilizza questo valore per copiare una stringa (che fa il memcpy). La mia ipotesi è che qualcosa stia distruggendo il tuo codice, sia esso un problema di sicurezza del thread, o una lettura di più byte in un buffer di quanto consentito.

Fonte pertinente :

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top