Issue #13043 has been reported by Cody Cutrer.

----------------------------------------
Bug #13043: Exception#cause can become recursive/infinite
https://bugs.ruby-lang.org/issues/13043

* Author: Cody Cutrer
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
In a certain situation, Exception#cause can become an infinite list:

```

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: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>