2013-08-12 14 views
12

Trong OpenSSl, các trang người dùng cho Đa số các cuộc gọi SSL_ * cho biết lỗi bằng cách trả về giá trị < = 0 và đề nghị gọi SSL_get_error() để nhận lỗi mở rộng .Cách quản lý hàng đợi lỗi trong openssl (SSL_get_error và ERR_get_error)

Nhưng trong các trang người đàn ông cho các cuộc gọi cũng như cho các cuộc gọi thư viện OpenSSL khác, có những tài liệu tham khảo mơ hồ để sử dụng "hàng đợi lỗi" trong OpenSSL - Đó là trường hợp nằm trong man page cho 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. 

Và ở chỗ trang rất giống con người, mô tả cho SSL_ERROR_SSL nói điều này:

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

này loại ngụ ý rằng có cái gì đó trong hàng đợi lỗi đáng đọc. Và không đọc nó làm cho một cuộc gọi tiếp theo để SSL_get_error không đáng tin cậy. Có lẽ, cuộc gọi để thực hiện là ERR_get_error.

Tôi định sử dụng ổ cắm không chặn trong mã của mình. Vì vậy, điều quan trọng là tôi phải tìm ra một cách đáng tin cậy khi điều kiện lỗi là SSL_ERROR_WANT_READ hoặc SSL_ERROR_WANT_WRITE để tôi có thể đặt ổ cắm vào chế độ hỏi vòng chính xác.

Vì vậy, câu hỏi của tôi là thế này:

  • Liệu SSL_get_error() gọi ERR_get_error() mặc nhiên đối với tôi? Hay tôi cần sử dụng cả hai?

  • Tôi có nên gọi số ERR_clear_error trước mọi cuộc gọi thư viện OpenSSL không?

  • Có thể nhiều hơn một lỗi có thể nằm trong hàng đợi sau khi cuộc gọi thư viện OpenSSL hoàn tất không? Do đó, có trường hợp nào mà lỗi đầu tiên trong hàng đợi có liên quan nhiều hơn lỗi cuối cùng không?

+0

Đối với người cuối cùng: Có, điều này có thể xảy ra. Có thể mức thấp hơn có lỗi, thêm thông báo vào hàng đợi và vì lỗi này, mức cao hơn trong thư viện sẽ thêm thông điệp của riêng nó. Trong một số trường hợp, tôi thấy năm và nhiều tin nhắn hơn trên ngăn xếp. – javex

+0

@javex - đã đồng ý. – selbie

Trả lời

4
  • SSL_get_error không gọi ERR_get_error. Vì vậy, nếu bạn chỉ cần gọi SSL_get_error, lỗi vẫn nằm trong hàng đợi.
  • Bạn nên gọi ERR_clear_error trước bất kỳ cuộc gọi SSL nào (SSL_read, SSL_write v.v.) được theo sau bởi SSL_get_error, nếu không bạn có thể đang đọc lỗi cũ xảy ra trước đó trong chuỗi hiện tại.
Các vấn đề liên quan