diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | ext/openssl/lib/openssl/ssl.rb | 5 | ||||
-rw-r--r-- | test/openssl/test_pair.rb | 69 |
3 files changed, 79 insertions, 1 deletions
@@ -1,3 +1,9 @@ +Wed May 7 21:45:00 2014 Tanaka Akira <[email protected]> + + * ext/openssl/lib/openssl/ssl.rb (OpenSSL::SSL::SSLServer#accept): + Consider Socket#accept as well as TCPServer#accept. + Reported by Sam Stelfox. [ruby-core:62064] [Bug #9750] + Wed May 7 17:24:07 2014 Nobuyoshi Nakada <[email protected]> * numeric.c (num_step_scan_args): check keyword arguments and fail diff --git a/ext/openssl/lib/openssl/ssl.rb b/ext/openssl/lib/openssl/ssl.rb index 0600080adc..bb5db9b5d3 100644 --- a/ext/openssl/lib/openssl/ssl.rb +++ b/ext/openssl/lib/openssl/ssl.rb @@ -225,7 +225,10 @@ module OpenSSL # Works similar to TCPServer#accept. def accept - sock = @svr.accept + # Socket#accept returns [socket, addrinfo]. + # TCPServer#accept returns a socket. + # The following comma strips addrinfo. + sock, = @svr.accept begin ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx) ssl.sync_close = true diff --git a/test/openssl/test_pair.rb b/test/openssl/test_pair.rb index 38b6989bac..70ea47da75 100644 --- a/test/openssl/test_pair.rb +++ b/test/openssl/test_pair.rb @@ -56,6 +56,64 @@ module SSLPair end end +module SSLPairLowlevelSocket + def server + host = "127.0.0.1" + port = 0 + ctx = OpenSSL::SSL::SSLContext.new() + ctx.ciphers = "ADH" + ctx.tmp_dh_callback = proc { OpenSSL::TestUtils::TEST_KEY_DH1024 } + tcps = Addrinfo.tcp(host, port).listen + ssls = OpenSSL::SSL::SSLServer.new(tcps, ctx) + return ssls + end + + def client(port) + host = "127.0.0.1" + ctx = OpenSSL::SSL::SSLContext.new() + ctx.ciphers = "ADH" + s = Addrinfo.tcp(host, port).connect + ssl = OpenSSL::SSL::SSLSocket.new(s, ctx) + ssl.connect + ssl.sync_close = true + ssl + end + + def ssl_pair + ssls = server + ths = Thread.new { + ns = ssls.accept + ssls.close + ns + } + port = ssls.to_io.connect_address.ip_port + thc = Thread.new { + client(port) + } + s = ths.value + c = thc.value + if block_given? + begin + yield c, s + ensure + c.close unless c.closed? + s.close unless s.closed? + end + else + return c, s + end + ensure + if ths && ths.alive? + ths.kill + ths.join + end + if thc && thc.alive? + thc.kill + thc.join + end + end +end + class OpenSSL::TestEOF1 < Test::Unit::TestCase include TestEOF include SSLPair @@ -309,4 +367,15 @@ class OpenSSL::TestPair < Test::Unit::TestCase end +class OpenSSL::TestPairLowlevelSocket < Test::Unit::TestCase + include SSLPairLowlevelSocket + + def test_getc + ssl_pair {|s1, s2| + s1 << "a" + assert_equal(?a, s2.getc) + } + end +end + end |