summaryrefslogtreecommitdiff
path: root/ruby_parser.c
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2024-02-08 10:43:50 -0500
committerPeter Zhu <[email protected]>2024-02-13 11:05:56 -0500
commita71d1ed83875600c174e66a8ace18e0ad451958a (patch)
tree1afb3c02d9144c14ab580a1f4f727e8c9f9c9927 /ruby_parser.c
parente4272fd292e7a432150e90c8dc7d8e9aa7d07e62 (diff)
Fix memory leak when parsing invalid hash symbol
For example: 10.times do 100_000.times do eval('{"\xC3": 1}') rescue EncodingError end puts `ps -o rss= -p #{$$}` end Before: 32032 48464 66112 84192 100592 117520 134096 150656 167168 183760 After: 17120 17120 17120 17120 18560 18560 18560 18560 18560 18560
Diffstat (limited to 'ruby_parser.c')
-rw-r--r--ruby_parser.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/ruby_parser.c b/ruby_parser.c
index 7061f2be5b..9560c66ef1 100644
--- a/ruby_parser.c
+++ b/ruby_parser.c
@@ -292,6 +292,18 @@ enc_symname_type(const char *name, long len, void *enc, unsigned int allowed_att
return rb_enc_symname_type(name, len, (rb_encoding *)enc, allowed_attrset);
}
+static ID
+check_id_cstr(const char *ptr, long len, void *enc)
+{
+ return rb_check_id_cstr(ptr, len, (rb_encoding *)enc);
+}
+
+static VALUE
+setup_fake_str(struct RString *fake_str, const char *name, long len, void *enc)
+{
+ return rb_setup_fake_str(fake_str, name, len, (rb_encoding *)enc);
+}
+
typedef struct {
struct parser_params *parser;
rb_encoding *enc;
@@ -551,6 +563,7 @@ static const rb_parser_config_t rb_global_parser_config = {
.id2str = rb_id2str,
.id2sym = rb_id2sym,
.sym2id = rb_sym2id,
+ .check_id_cstr = check_id_cstr,
.str_catf = rb_str_catf,
.str_cat_cstr = rb_str_cat_cstr,
@@ -565,10 +578,12 @@ static const rb_parser_config_t rb_global_parser_config = {
.str_resize = rb_str_resize,
.str_new = rb_str_new,
.str_new_cstr = rb_str_new_cstr,
+ .setup_fake_str = setup_fake_str,
.fstring = rb_fstring,
.is_ascii_string = is_ascii_string2,
.enc_str_new = enc_str_new,
.enc_str_buf_cat = enc_str_buf_cat,
+ .enc_str_coderange = rb_enc_str_coderange,
.str_buf_append = rb_str_buf_append,
.str_vcatf = rb_str_vcatf,
.string_value_cstr = rb_string_value_cstr,
@@ -628,6 +643,7 @@ static const rb_parser_config_t rb_global_parser_config = {
.encoding_set = encoding_set,
.encoding_is_ascii8bit = encoding_is_ascii8bit,
.usascii_encoding = usascii_encoding,
+ .enc_coderange_broken = ENC_CODERANGE_BROKEN,
.ractor_make_shareable = rb_ractor_make_shareable,