From 3ca6da24e397e550d589a69791be7697c0cb73c6 Mon Sep 17 00:00:00 2001 From: yui-knk Date: Fri, 23 Feb 2024 09:30:14 +0900 Subject: [PATCH] [Bug #20295] Fix SEGV when parsing invalid regexp --- parse.y | 10 ++++++---- test/ruby/test_syntax.rb | 8 ++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/parse.y b/parse.y index c753dec91f..1631bdecc2 100644 --- a/parse.y +++ b/parse.y @@ -13017,10 +13017,12 @@ match_op(struct parser_params *p, NODE *node1, NODE *node2, const YYLTYPE *op_lo case NODE_REGX: { const VALUE lit = rb_node_regx_string_val(n); - NODE *match = NEW_MATCH2(node1, node2, loc); - RNODE_MATCH2(match)->nd_args = reg_named_capture_assign(p, lit, loc); - nd_set_line(match, line); - return match; + if (!NIL_P(lit)) { + NODE *match = NEW_MATCH2(node1, node2, loc); + RNODE_MATCH2(match)->nd_args = reg_named_capture_assign(p, lit, loc); + nd_set_line(match, line); + return match; + } } } } diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index d494820388..42108f955f 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -1034,6 +1034,14 @@ eom assert_not_match(/end-of-input/, e.message) end + def test_invalid_regexp + bug20295 = '[ruby-core:116913] [Bug #20295]' + + assert_syntax_error("/[/=~s", /premature end of char-class/, bug20295) + assert_syntax_error("/(?<>)/=~s", /group name is empty/, bug20295) + assert_syntax_error("/(?[)/=~s", /premature end of char-class/, bug20295) + end + def test_lineno_operation_brace_block expected = __LINE__ + 1 actual = caller_lineno\