diff options
| author | NARUSE, Yui <nurse@users.noreply.github.com> | 2024-03-14 16:53:14 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-14 07:53:14 +0000 |
| commit | 577f9c7a8334bb33512f01e7db95f6fb15e280b2 (patch) | |
| tree | a7944fca006a3b2a813fd3227b047023e356d599 | |
| parent | ade02f3c8909a8bf630af2c88f00b7bd7ff02682 (diff) | |
Backport 37ed86fd3c798e298fad9db6e7df1f3f45e1e03b (#10248)
merge revision(s) 37ed86fd3c798e298fad9db6e7df1f3f45e1e03b: [Backport #--ticket=20161]
Fix memory leak in regexp grapheme clusters
[Bug #20161]
The cc->mbuf gets overwritten, so we need to free it to not leak memory.
For example:
str = "hello world".encode(Encoding::UTF_32LE)
10.times do
1_000.times do
str.grapheme_clusters
end
puts `ps -o rss= -p #{$$}`
end
Before:
15536
15760
15920
16144
16304
16480
16640
16784
17008
17280
After:
15584
15584
15760
15824
15888
15888
15888
15888
16048
16112
---
regparse.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
| -rw-r--r-- | regparse.c | 3 | ||||
| -rw-r--r-- | version.h | 2 |
2 files changed, 3 insertions, 2 deletions
diff --git a/regparse.c b/regparse.c index 1ce15da8f5..57ecd78dee 100644 --- a/regparse.c +++ b/regparse.c @@ -6105,7 +6105,8 @@ node_extended_grapheme_cluster(Node** np, ScanEnv* env) R_ERR(add_code_range(&(cc->mbuf), env, 0x000A, 0x000A)); /* CR */ R_ERR(add_code_range(&(cc->mbuf), env, 0x000D, 0x000D)); /* LF */ R_ERR(not_code_range_buf(env->enc, cc->mbuf, &inverted_buf, env)); - cc->mbuf = inverted_buf; /* TODO: check what to do with buffer before inversion */ + bbuf_free(cc->mbuf); + cc->mbuf = inverted_buf; env->warnings_flag &= dup_not_warned; /* TODO: fix false warning */ } @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 12 +#define RUBY_PATCHLEVEL 13 #include "ruby/version.h" #include "ruby/internal/abi.h" |
