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) ripper_parser_mark2(void *ptr)
{ {
struct ripper *r = (struct ripper*)ptr; struct ripper *r = (struct ripper*)ptr;
ripper_parser_mark(r->p); if (r->p) ripper_parser_mark(r->p);
} }
static void static void
ripper_parser_free2(void *ptr) ripper_parser_free2(void *ptr)
{ {
struct ripper *r = (struct ripper*)ptr; struct ripper *r = (struct ripper*)ptr;
ripper_parser_free(r->p); if (r->p) ripper_parser_free(r->p);
xfree(r); xfree(r);
} }
@ -40,7 +40,7 @@ static size_t
ripper_parser_memsize2(const void *ptr) ripper_parser_memsize2(const void *ptr)
{ {
struct ripper *r = (struct ripper*)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 = { 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' @ripper = Ripper.new '1 + 1'
end 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 def test_column
assert_nil @ripper.column assert_nil @ripper.column
end end