diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-07-16 15:41:10 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-07-16 15:41:10 +0900 |
commit | 5c77402d885799e2465e291bf879dcfbd06ba77c (patch) | |
tree | 9ea230b5b0e5f7a445597a3cd53f3f5ab3fccc67 /ext/ripper/ripper_init.c.tmpl | |
parent | da39936ce165ea9462b9e192eb6b608485c94842 (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.tmpl | 6 |
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 = { |