summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2024-01-18 11:51:58 +0900
committernagachika <nagachika@ruby-lang.org>2024-01-18 11:51:58 +0900
commita26b41bf7a2db69b0889ed599f568a4ba2529eba (patch)
treeb33c9549ee43b7291fff68744a846c55e7a0cd13
parentb4f8623441a8be53b643fed826ba44e933cafd7e (diff)
merge revision(s) 37ed86fd3c798e298fad9db6e7df1f3f45e1e03b: [Backport #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.c3
-rw-r--r--version.h2
2 files changed, 3 insertions, 2 deletions
diff --git a/regparse.c b/regparse.c
index 4ebd5f1c46..33df0e06c7 100644
--- a/regparse.c
+++ b/regparse.c
@@ -5977,7 +5977,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 a75cf52e2f..41525ce8f0 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 2
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 152
+#define RUBY_PATCHLEVEL 153
#include "ruby/version.h"
#include "ruby/internal/abi.h"