From: usa@... Date: 2017-01-04T02:05:36+00:00 Subject: [ruby-core:78964] [Ruby trunk Bug#13043] Exception#cause can become recursive/infinite Issue #13043 has been updated by Usaku NAKAMURA. Backport changed from 2.1: REQUIRED, 2.2: DONE, 2.3: REQUIRED to 2.1: WONTFIX, 2.2: WONTFIX, 2.3: REQUIRED I've finally gave up to backport this into `ruby_2_2`, because of a test of `rake` failed. I doubt that the test is nonsense, but a maintenance branch should be conservative about changing its behavior. ---------------------------------------- Bug #13043: Exception#cause can become recursive/infinite https://bugs.ruby-lang.org/issues/13043#change-62383 * Author: Cody Cutrer * Status: Closed * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16] * Backport: 2.1: WONTFIX, 2.2: WONTFIX, 2.3: REQUIRED ---------------------------------------- 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 -- https://bugs.ruby-lang.org/ Unsubscribe: