Fix null pointer access in Ripper#initialize

In `rb_ruby_ripper_parser_allocate`, `r->p` is NULL between creating
`self` and `parser_params` assignment.  As GC can happen there, the
typed-data functions for it need to consider the case.
This commit is contained in:
Nobuyoshi Nakada 2023-07-16 15:41:10 +09:00
parent da39936ce1
commit 5c77402d88
No known key found for this signature in database
GPG Key ID: 3582D74E1FEE4465
Notes: git 2023-07-16 08:47:49 +00:00
2 changed files with 10 additions and 3 deletions

View File

@ -25,14 +25,14 @@ static void
ripper_parser_mark2(void *ptr)
{
struct ripper *r = (struct ripper*)ptr;
ripper_parser_mark(r->p);
if (r->p) ripper_parser_mark(r->p);
}
static void
ripper_parser_free2(void *ptr)
{
struct ripper *r = (struct ripper*)ptr;
ripper_parser_free(r->p);
if (r->p) ripper_parser_free(r->p);
xfree(r);
}
@ -40,7 +40,7 @@ static size_t
ripper_parser_memsize2(const void *ptr)
{
struct ripper *r = (struct ripper*)ptr;
return ripper_parser_memsize(r->p);
return (r->p) ? ripper_parser_memsize(r->p) : 0;
}
static const rb_data_type_t parser_data_type = {

View File

@ -14,6 +14,13 @@ class TestRipper::Ripper < Test::Unit::TestCase
@ripper = Ripper.new '1 + 1'
end
def test_new
assert_separately(%w[-rripper], "#{<<~"begin;"}\n#{<<~'end;'}")
begin;
assert_nil EnvUtil.under_gc_stress {Ripper.new("")}.state
end;
end
def test_column
assert_nil @ripper.column
end