Bug #19773
Updated by eightbitraptor (Matt V-H) about 2 years ago
[Github PR 8089](https://github.com/ruby/ruby/pull/8089)
Intermittent SIGSEGV during marking of the Ripper parser. A failing build [can be seen on ci.rvm.jp (build 4643684)](http://ci.rvm.jp/results/trunk-random2@ruby-sp2-docker/4643684).
Inside `ripper_s_allocate` first we use `TypedData_Make_Struct` to create a new `T_DATA` object in the Ruby heap. This allocates an empty struct (`struct ripper`). Further down the function we allocate another struct (`struct parser_params` during `rb_ruby_ripper_parser_allcoate`) and assign it to a pointer from the first struct, which is attached to the `T_DATA` object.
`rb_ruby_ripper_parser_allocate` can trigger GC, as it uses `ruby_xcalloc`. But if GC is triggered at this point then the `parser_params` have not been allocated yet, and so the `struct ripper` contains a `NULL` reference.
This causes a SEGV when we try and mark the `T_DATA` wrapper around the `struct ripper`.
This can be replicated locally using the following test script
```
require "ripper"
GC.stress = true
Ripper.new
```