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)

Reply via email to