diff --git a/changelog.md b/changelog.md index de98edd..878b371 100644 --- a/changelog.md +++ b/changelog.md @@ -24,7 +24,12 @@ HEAD specified instead (This was the previous behavior). #596 #653 Thank you Vinnie Falco and Gianfranco Costamagna for reporting. - Compatibility: Better error handling and logging in cases where extension - requests parse correctly but negotiation fails. + requests parse correctly but negotiation fails. +- Compatibility: Removed custom handling of SSL_R_SHORT_READ error condition. + This error code no longer exists in modern versions of OpenSSL and causes + a build error. It wasn't being used for anything particularly important + (slightly improving error reporting) and there isn't a great replacement. + #599 Thank you Gianfranco Costamagna for reporting. - Bug: Store loggers in shared pointers to avoid crashes related to connections trying to write logs entries after their respective endpoint has been deallocated. Thank you Thalhammer for reporting and Jupp Müller for the diff --git a/websocketpp/common/asio.hpp b/websocketpp/common/asio.hpp index 3c8fa13..3835772 100644 --- a/websocketpp/common/asio.hpp +++ b/websocketpp/common/asio.hpp @@ -88,6 +88,9 @@ namespace lib { inline lib::chrono::milliseconds milliseconds(long duration) { return lib::chrono::milliseconds(duration); } + + } // namespace error + } // namespace ssl } // namespace asio #else diff --git a/websocketpp/impl/connection_impl.hpp b/websocketpp/impl/connection_impl.hpp index ae55c33..93a5a16 100644 --- a/websocketpp/impl/connection_impl.hpp +++ b/websocketpp/impl/connection_impl.hpp @@ -999,19 +999,16 @@ void connection::handle_read_frame(lib::error_code const & ec, "handle_read_frame: got invalid istate in closed state"); return; } - } else if (ecm == transport::error::tls_short_read) { - if (m_state == session::state::closed) { - // We expect to get a TLS short read if we try to read after the - // connection is closed. If this happens ignore and exit the - // read frame path. - terminate(lib::error_code()); - return; - } - echannel = log::elevel::rerror; } else if (ecm == transport::error::action_after_shutdown) { echannel = log::elevel::info; + } else { + // TODO: more generally should we do something different here in the + // case that m_state is cosed? Are errors after the connection is + // already closed really an rerror? } + + log_err(echannel, "handle_read_frame", ecm); this->terminate(ecm); return; diff --git a/websocketpp/transport/asio/connection.hpp b/websocketpp/transport/asio/connection.hpp index 5428c5f..60f88a7 100644 --- a/websocketpp/transport/asio/connection.hpp +++ b/websocketpp/transport/asio/connection.hpp @@ -1116,17 +1116,10 @@ protected: tec = socket_con_type::translate_ec(ec); m_tec = ec; - if (tec == transport::error::tls_short_read) { - // TLS short read at this point is somewhat expected if both - // sides try and end the connection at the same time or if - // SSLv2 is being used. In general there is nothing that can - // be done here other than a low level development log. - } else { - // all other errors are effectively pass through errors of - // some sort so print some detail on the info channel for - // library users to look up if needed. - log_err(log::elevel::info,"asio async_shutdown",ec); - } + // all other errors are effectively pass through errors of + // some sort so print some detail on the info channel for + // library users to look up if needed. + log_err(log::elevel::info,"asio async_shutdown",ec); } } else { if (m_alog->static_test(log::alevel::devel)) { diff --git a/websocketpp/transport/asio/security/tls.hpp b/websocketpp/transport/asio/security/tls.hpp index b727b79..e6aef45 100644 --- a/websocketpp/transport/asio/security/tls.hpp +++ b/websocketpp/transport/asio/security/tls.hpp @@ -355,13 +355,9 @@ protected: template lib::error_code translate_ec(ErrorCodeType ec) { if (ec.category() == lib::asio::error::get_ssl_category()) { - if (ERR_GET_REASON(ec.value()) == SSL_R_SHORT_READ) { - return make_error_code(transport::error::tls_short_read); - } else { - // We know it is a TLS related error, but otherwise don't know - // more. Pass through as TLS generic. - return make_error_code(transport::error::tls_error); - } + // We know it is a TLS related error, but otherwise don't know more. + // Pass through as TLS generic. + return make_error_code(transport::error::tls_error); } else { // We don't know any more information about this error so pass // through @@ -372,14 +368,6 @@ protected: /// Overload of translate_ec to catch cases where lib::error_code is the /// same type as lib::asio::error_code lib::error_code translate_ec(lib::error_code ec) { - // Normalize the tls_short_read error as it is used by the library and - // needs a consistent value. All other errors pass through natively. - // TODO: how to get the SSL category from std::error? - /*if (ec.category() == lib::asio::error::get_ssl_category()) { - if (ERR_GET_REASON(ec.value()) == SSL_R_SHORT_READ) { - return make_error_code(transport::error::tls_short_read); - } - }*/ return ec; } private: