summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2024-06-11 14:01:29 -0400
committerGitHub <noreply@github.com>2024-06-11 11:01:29 -0700
commit4c50d23245689761e04db450ced9fe9fa76997d0 (patch)
treece372b2b6c65651e7bdee240912ce04baa8c07d6 /parse.y
parent40251ed0dfe99bb09c2fa542fce603ade25e3729 (diff)
Raise SyntaxError on invalid encoding symbol (#10967)
[Bug #20280] Backport of #10014.
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y18
1 files changed, 16 insertions, 2 deletions
diff --git a/parse.y b/parse.y
index dd96d6136e..3eadb0bdf5 100644
--- a/parse.y
+++ b/parse.y
@@ -12846,9 +12846,22 @@ new_defined(struct parser_params *p, NODE *expr, const YYLTYPE *loc)
return NEW_DEFINED(n, loc);
}
+static VALUE
+str_to_sym_check(struct parser_params *p, VALUE lit, const YYLTYPE *loc)
+{
+ if (rb_enc_str_coderange(lit) == ENC_CODERANGE_BROKEN) {
+ yyerror1(loc, "invalid symbol");
+ lit = STR_NEW0();
+ }
+
+ return lit;
+}
+
static NODE*
symbol_append(struct parser_params *p, NODE *symbols, NODE *symbol)
{
+ VALUE lit;
+
enum node_type type = nd_type(symbol);
switch (type) {
case NODE_DSTR:
@@ -12856,7 +12869,8 @@ symbol_append(struct parser_params *p, NODE *symbols, NODE *symbol)
break;
case NODE_STR:
nd_set_type(symbol, NODE_LIT);
- RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_LIT(symbol)->nd_lit = rb_str_intern(RNODE_LIT(symbol)->nd_lit));
+ lit = str_to_sym_check(p, RNODE_LIT(symbol)->nd_lit, &RNODE(symbol)->nd_loc);
+ RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_LIT(symbol)->nd_lit = rb_str_intern(lit));
break;
default:
compile_error(p, "unexpected node as symbol: %s", parser_node_name(type));
@@ -14553,7 +14567,7 @@ dsym_node(struct parser_params *p, NODE *node, const YYLTYPE *loc)
nd_set_loc(node, loc);
break;
case NODE_STR:
- lit = RNODE_STR(node)->nd_lit;
+ lit = str_to_sym_check(p, RNODE_STR(node)->nd_lit, &RNODE(node)->nd_loc);
RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_STR(node)->nd_lit = ID2SYM(rb_intern_str(lit)));
nd_set_type(node, NODE_LIT);
nd_set_loc(node, loc);