Bug #13043
Updated by nobu (Nobuyoshi Nakada) almost 8 years ago
In a certain situation, Exception#cause can become an infinite list: ```ruby ``` def raise_errors begin raise "error 1" ensure orig_error = $! begin raise "error 2" rescue => err raise orig_error || err end end end x = nil begin raise_errors rescue x = $! end x.cause.cause.object_id == x.object_id ``` Note that this pattern happened during an HTTP request with net/http: see https://github.com/ruby/ruby/blob/v2_3_1/lib/net/http/response.rb#L261. I would expect that x would be "error 2", x.cause would be "error 1", and x.cause.cause would be nil. Instead an infinite loop forms, breaking error reporting code that loops over an exception's cause