From 577f9c7a8334bb33512f01e7db95f6fb15e280b2 Mon Sep 17 00:00:00 2001 From: "NARUSE, Yui" Date: Thu, 14 Mar 2024 16:53:14 +0900 Subject: [PATCH] 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(-) --- regparse.c | 3 ++- 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 */ } diff --git a/version.h b/version.h index 39717974d2..bdeb9f6ab6 100644 --- a/version.h +++ b/version.h @@ -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"