From d3ff43852b22f5463d22aab390ef340d9ebe4b06 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 29 Jun 2023 15:25:31 -0400 Subject: Fix memory leak in Hash#replace Hash#replace can leak memory if the receiver has an ST table. --- hash.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'hash.c') diff --git a/hash.c b/hash.c index a779c6f218..f3514cd94b 100644 --- a/hash.c +++ b/hash.c @@ -1158,6 +1158,19 @@ ar_clear(VALUE hash) } } +static void +st_free_and_clear_table(VALUE hash) +{ + HASH_ASSERT(RHASH_ST_TABLE_P(hash)); + + st_table *tab = RHASH_ST_TABLE(hash); + + if (tab->bins != NULL) free(tab->bins); + free(tab->entries); + + RHASH_ST_CLEAR(hash); +} + typedef int st_foreach_func(st_data_t, st_data_t, st_data_t); struct foreach_safe_arg { @@ -2894,7 +2907,7 @@ rb_hash_replace(VALUE hash, VALUE hash2) ar_free_and_clear_table(hash); } else { - RHASH_ST_CLEAR(hash); + st_free_and_clear_table(hash); } hash_copy(hash, hash2); -- cgit v1.2.3