diff options
author | Peter Zhu <[email protected]> | 2024-02-08 10:43:50 -0500 |
---|---|---|
committer | Peter Zhu <[email protected]> | 2024-02-13 11:05:56 -0500 |
commit | a71d1ed83875600c174e66a8ace18e0ad451958a (patch) | |
tree | 1afb3c02d9144c14ab580a1f4f727e8c9f9c9927 /ruby_parser.c | |
parent | e4272fd292e7a432150e90c8dc7d8e9aa7d07e62 (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.c | 16 |
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, |