2013-08-12 34 views
12

OpenSSlのmanページSSL_ *呼び出しの大部分は、値< = 0を返してエラーを示し、SSL_get_error()を呼び出して拡張エラーを取得することを推奨します。openssl(SSL_get_errorおよびERR_get_error)のエラーキューを管理する方法

しかし、これらの呼び出しのためのmanページ内だけでなく、他のOpenSSLライブラリの呼び出しのために、OpenSSLの中に「エラー・キュー」を使用することに漠然とした参照がある - そのような物はSSL_get_errorのmanページにケースです:

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. 

そして、それは非常に同じmanページでは、SSL_ERROR_SSLの説明はこれを言う:

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

この種のは、読む価値がエラー・キューに何かがあることを意味します。それを読み取れないと、その後のSSL_get_errorの呼び出しが信頼できなくなります。おそらく、makeの呼び出しはERR_get_errorです。

私のコードでは、非ブロッキングソケットを使用する予定です。したがって、エラー状態がSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのときは確実に検出して、ソケットを正しいポーリングモードにすることが重要です。

だから私の質問はこれです:

  • SSL_get_errorは()私のために暗黙的にERR_get_error()を呼び出していますか?それとも両方を使う必要がありますか?

  • すべてのOpenSSLライブラリコールの前にERR_clear_errorに電話する必要がありますか?

  • OpenSSLライブラリ呼び出しの完了後、複数のエラーがキューに存在する可能性はありますか?したがって、キュー内の最初のエラーが最後のエラーよりも重要な状況がありますか?

+0

最後の1つについて:はい、これは起こりうる。下位レベルにエラーがあり、キューにメッセージを追加する可能性があります。このエラーのために、ライブラリの上位レベルが独自のメッセージを追加します。場合によっては、スタック上に5つ以上のメッセージが表示されることがありました。 – javex

+0

@ javex - 同意します。 – selbie

答えて

4
  • SSL_get_errorがERR_get_errorを呼び出すことはありません。つまり、SSL_get_errorを呼び出すだけであれば、エラーはキューに残ります。
  • SSL_get_errorが後に続くANY SSL呼び出し(SSL_read、SSL_writeなど)の前にERR_clear_errorを呼び出す必要があります。そうしないと、現在のスレッドで以前に発生した古いエラーを読み取っている可能性があります。
関連する問題