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
This commit is contained in:
shugo 2017-01-12 02:19:17 +00:00
parent d9421e1376
commit 58935eb8bd
2 changed files with 23 additions and 2 deletions

View File

@ -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

View File

@ -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)