diff -wpruN --no-dereference '--exclude=*.orig' a~/ext/openssl/ossl_ssl.c a/ext/openssl/ossl_ssl.c --- a~/ext/openssl/ossl_ssl.c 1970-01-01 00:00:00 +++ a/ext/openssl/ossl_ssl.c 1970-01-01 00:00:00 @@ -1956,6 +1956,7 @@ ossl_ssl_read_internal(int argc, VALUE * io_wait_writable(fptr); continue; case SSL_ERROR_WANT_READ: +wantread: if (nonblock) { rb_str_unlocktmp(str); if (no_exception_p(opts)) { return sym_wait_readable; } @@ -1966,7 +1967,9 @@ ossl_ssl_read_internal(int argc, VALUE * case SSL_ERROR_SYSCALL: if (!ERR_peek_error()) { rb_str_unlocktmp(str); - if (errno) + if (errno == EAGAIN) + goto wantread; + else if (errno) rb_sys_fail(0); else { /*