diff --git a/ChangeLog b/ChangeLog index 0fca5a1013..2ab4c9086a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Apr 1 04:50:44 2016 Eric Wong + + * ext/openssl/ossl_ssl.c (ossl_sslctx_s_alloc): + enable SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER by default + [Bug #12126] + Fri Apr 1 01:13:55 2016 Benoit Daloze * thread.c (update_coverage): Do not track coverage in loaded files diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c index 0e01d7c0b1..5fcd2145c3 100644 --- a/ext/openssl/ossl_ssl.c +++ b/ext/openssl/ossl_ssl.c @@ -145,7 +145,8 @@ static VALUE ossl_sslctx_s_alloc(VALUE klass) { SSL_CTX *ctx; - long mode = SSL_MODE_ENABLE_PARTIAL_WRITE; + long mode = SSL_MODE_ENABLE_PARTIAL_WRITE | + SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER; VALUE obj; #ifdef SSL_MODE_RELEASE_BUFFERS diff --git a/test/openssl/test_pair.rb b/test/openssl/test_pair.rb index 06ed3836ca..06c34442b7 100644 --- a/test/openssl/test_pair.rb +++ b/test/openssl/test_pair.rb @@ -280,6 +280,35 @@ module OpenSSL::TestPairM } end + def test_write_nonblock_retry + ssl_pair {|s1, s2| + # fill up a socket so we hit EAGAIN + written = String.new + n = 0 + buf = 'a' * 11 + case ret = s1.write_nonblock(buf, exception: false) + when :wait_readable then break + when :wait_writable then break + when Integer + written << buf + n += ret + exp = buf.bytesize + if ret != exp + buf = buf.byteslice(ret, exp - ret) + end + end while true + assert_kind_of Symbol, ret + + # make more space for subsequent write: + readed = s2.read(n) + assert_equal written, readed + + # this fails if SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is missing: + buf2 = Marshal.load(Marshal.dump(buf)) + assert_kind_of Integer, s1.write_nonblock(buf2, exception: false) + } + end + def tcp_pair host = "127.0.0.1" serv = TCPServer.new(host, 0)