Remove custom handling of SSL_R_SHORT_READ errors. fixes #599
This commit is contained in:
1 parent
9ddb300d87
commit
16d126ee61
5 files changed
+22
-36
No files matched your search
+6
-1
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -999,19 +999,16 @@ void connection<config>::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;
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -355,13 +355,9 @@ protected:
|
||||
template <typename ErrorCodeType>
|
||||
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:
|
||||
|
||||
Reference in new issue
Block a user