diff options
author | shugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-01-12 02:19:17 +0000 |
---|---|---|
committer | shugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-01-12 02:19:17 +0000 |
commit | 58935eb8bdad1a42ce35efd0e0b0a9d7d43df299 (patch) | |
tree | 6ed3b721abc358f6c14274dc288c25aeba31ac35 | |
parent | d9421e1376f533e44d91d0cbfeaf054ef612e7d1 (diff) | |
download | ruby-58935eb8bdad1a42ce35efd0e0b0a9d7d43df299.tar.gz |
lib/net/protocol.rb: preserve backtrace information
BufferedIO#rbuf_fill should preserve backtrace information when raising
EOFError. Otherwise, users get confused when EOFError is leaked out from
Net::SMTP etc. [ruby-core:78550] [Bug #13018]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57311 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | lib/net/protocol.rb | 3 | ||||
-rw-r--r-- | test/net/smtp/test_smtp.rb | 22 |
2 files changed, 23 insertions, 2 deletions
diff --git a/lib/net/protocol.rb b/lib/net/protocol.rb index 1ea7f6bfc3..518b92c4ab 100644 --- a/lib/net/protocol.rb +++ b/lib/net/protocol.rb @@ -181,8 +181,7 @@ module Net # :nodoc: @io.to_io.wait_writable(@read_timeout) or raise Net::ReadTimeout # continue looping when nil - # callers do not care about backtrace, so avoid allocating for it - raise EOFError, 'end of file reached', [] + raise EOFError, 'end of file reached' end while true end diff --git a/test/net/smtp/test_smtp.rb b/test/net/smtp/test_smtp.rb index 01b8ae504c..89a08cb17b 100644 --- a/test/net/smtp/test_smtp.rb +++ b/test/net/smtp/test_smtp.rb @@ -157,6 +157,28 @@ module Net end end + def test_eof_error_backtrace + bug13018 = '[ruby-core:78550] [Bug #13018]' + servers = Socket.tcp_server_sockets("localhost", 0) + begin + sock = nil + Thread.start do + sock = accept(servers) + sock.close + end + smtp = Net::SMTP.new("localhost", servers[0].local_address.ip_port) + e = assert_raise(EOFError, bug13018) do + smtp.start do + end + end + assert_equal(EOFError, e.class, bug13018) + assert(e.backtrace.grep(%r"\bnet/smtp\.rb:").size > 0, bug13018) + ensure + sock.close if sock + servers.each(&:close) + end + end + private def accept(servers) |