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:
parent
da39936ce1
commit
5c77402d88
Notes:
git
2023-07-16 08:47:49 +00:00
@ -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 = {
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user