Jens Geyer created THRIFT-6072:
----------------------------------
Summary: Ruby ThreadedServer and SimpleServer crash on SSL accept
errors
Key: THRIFT-6072
URL: https://issues.apache.org/jira/browse/THRIFT-6072
Project: Thrift
Issue Type: Bug
Components: Ruby - Library
Reporter: Jens Geyer
{{ThreadedServer}} and {{SimpleServer}} call {{@server_transport.accept}}
without rescuing accept-level exceptions. When a plain TCP probe (e.g., the
cross-test runner's {{ensure_socket_open}} readiness check) connects to an SSL
port and immediately disconnects, the SSL handshake fails with
{{OpenSSL::SSL::SSLError}}. This exception is not caught by the inner
per-client rescue ({{Thrift::TransportException, Thrift::ProtocolException}}),
so it propagates through the {{loop do}}, hits the outer {{ensure}}, and the
server exits.
Observed as cross-test flake: {{rb-cpp accel-binary buffered-ip-ssl
failure(64)}} where {{failure(64)}} means the server process exited before the
client was started (RESULT_ERROR in the cross-test runner).
{{ThreadPoolServer}} is already safe because it has a broad {{rescue => e}}
around the entire worker block. {{NonblockingServer}} rescues
{{Errno::ECONNRESET}}. Only {{ThreadedServer}} and {{SimpleServer}} are exposed.
*Fix:* Add a targeted rescue around the {{accept}} call in both servers to
catch {{Errno::ECONNRESET}}, {{Errno::EPIPE}}, and {{OpenSSL::SSL::SSLError}}
(checked via {{defined?}} to avoid a hard OpenSSL dependency), then {{next}} to
retry the accept loop. All other exceptions (including {{IOError}} on server
socket close) propagate normally.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)