diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c index 236d455ff..cb37d7e07 100644 --- a/ext/openssl/ossl_ssl.c +++ b/ext/openssl/ossl_ssl.c @@ -1729,7 +1729,9 @@ static void io_wait_writable(VALUE io) { #ifdef HAVE_RB_IO_MAYBE_WAIT - rb_io_maybe_wait_writable(errno, io, RUBY_IO_TIMEOUT_DEFAULT); + if (!rb_io_maybe_wait_writable(errno, io, RUBY_IO_TIMEOUT_DEFAULT)) { + rb_raise(rb_eIOTimeoutError, "Timed out while waiting to become writable!"); + } #else rb_io_t *fptr; GetOpenFile(io, fptr); @@ -1741,7 +1743,9 @@ static void io_wait_readable(VALUE io) { #ifdef HAVE_RB_IO_MAYBE_WAIT - rb_io_maybe_wait_readable(errno, io, RUBY_IO_TIMEOUT_DEFAULT); + if (!rb_io_maybe_wait_readable(errno, io, RUBY_IO_TIMEOUT_DEFAULT)) { + rb_raise(rb_eIOTimeoutError, "Timed out while waiting to become readable!"); + } #else rb_io_t *fptr; GetOpenFile(io, fptr); diff --git a/lib/openssl/ssl.rb b/lib/openssl/ssl.rb index ccc945f2f..4278eb1b4 100644 --- a/lib/openssl/ssl.rb +++ b/lib/openssl/ssl.rb @@ -299,6 +299,16 @@ def wait_readable(*args) def wait_writable(*args) to_io.wait_writable(*args) end + + if IO.method_defined?(:timeout) + def timeout + to_io.timeout + end + + def timeout=(value) + to_io.timeout=(value) + end + end end def verify_certificate_identity(cert, hostname) diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb index 07dc9a343..14b3dc3bd 100644 --- a/test/openssl/test_ssl.rb +++ b/test/openssl/test_ssl.rb @@ -193,6 +193,17 @@ def test_sysread_and_syswrite } end + def test_read_with_timeout + omit "does not support timeout" unless IO.method_defined?(:timeout) + + start_server do |port| + server_connect(port) do |ssl| + ssl.timeout = 0.001 + assert_raise(IO::TimeoutError) {ssl.read(1)} + end + end + end + def test_getbyte start_server { |port| server_connect(port) { |ssl|