summaryrefslogtreecommitdiff
path: root/ext/ripper/ripper_init.c.tmpl
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-07-16 15:41:10 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-07-16 15:41:10 +0900
commit5c77402d885799e2465e291bf879dcfbd06ba77c (patch)
tree9ea230b5b0e5f7a445597a3cd53f3f5ab3fccc67 /ext/ripper/ripper_init.c.tmpl
parentda39936ce165ea9462b9e192eb6b608485c94842 (diff)
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.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/8085
Diffstat (limited to 'ext/ripper/ripper_init.c.tmpl')
-rw-r--r--ext/ripper/ripper_init.c.tmpl6
1 files changed, 3 insertions, 3 deletions
diff --git a/ext/ripper/ripper_init.c.tmpl b/ext/ripper/ripper_init.c.tmpl
index 32b8aa4398..98f260f8b1 100644
--- a/ext/ripper/ripper_init.c.tmpl
+++ b/ext/ripper/ripper_init.c.tmpl
@@ -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 = {