2013-08-12 5 views
12

In OpenSSl, le pagine man per La maggior parte delle chiamate SSL_ * indicano un errore restituendo un valore < = 0 e suggeriscono di chiamare SSL_get_error() per ottenere l'errore esteso .Come gestire la coda degli errori in openssl (SSL_get_error e ERR_get_error)

Ma all'interno le pagine man di queste chiamate, così come per le altre chiamate di libreria OpenSSL, ci sono vaghi riferimenti a usare la "coda di errore" in OpenSSL - Tale è il caso nella pagina man per SSL_get_error:

The current thread's error queue must be empty before the TLS/SSL I/O 
    operation is attempted, or SSL_get_error() will not work reliably. 

E in quella stessa pagina man, la descrizione di questo SSL_ERROR_SSL dice:

SSL_ERROR_SSL 
     A failure in the SSL library occurred, usually a protocol error. 
     The OpenSSL error queue contains more information on the error. 

questo tipo di implica che ci sia qualcosa nella coda di errore la pena di leggere. E la mancata lettura rende inaffidabile una successiva chiamata a SSL_get_error. Presumibilmente, la chiamata per effettuare è ERR_get_error.

Ho intenzione di utilizzare socket non bloccanti nel mio codice. Pertanto, è importante scoprire in modo affidabile quando la condizione di errore è SSL_ERROR_WANT_READ o SSL_ERROR_WANT_WRITE, in modo da poter inserire il socket nella corretta modalità di polling.

Quindi le mie domande sono questo:

  • fa SSL_get_error() chiamata ERR_get_error() implicitamente per me? O devo usare entrambi?

  • Devo chiamare ERR_clear_error prima di ogni chiamata di libreria OpenSSL?

  • È possibile che più di un errore si verifichi nella coda dopo il completamento di una chiamata di libreria OpenSSL? Quindi, ci sono circostanze in cui il primo errore nella coda è più rilevante dell'ultimo errore?

+0

Per l'ultimo: Sì, questo potrebbe accadere. È possibile che un livello inferiore abbia un errore, aggiunga un messaggio alla coda e a causa di questo errore un livello superiore nella libreria aggiunga il proprio messaggio. In alcuni casi ho visto cinque e più messaggi in pila. – javex

+0

@javex - d'accordo. – selbie

risposta

4
  • SSL_get_error non chiama ERR_get_error. Quindi, se si chiama SSL_get_error, l'errore rimane in coda.
  • Si dovrebbe chiamare ERR_clear_error prima di QUALSIASI chiamata SSL (SSL_read, SSL_write etc) seguita da SSL_get_error, altrimenti si potrebbe leggere un vecchio errore che si era verificato precedentemente nel thread corrente.