aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-09-26 16:51:09 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-09-26 16:51:09 +0000
commit15904793905a95859d6e9f44d4c91821d72b9dcb (patch)
tree8063d6ffd4c2401fd70f571f321a6155bd4848dc /gc.c
parent345c645fa028d7bf3109a1dafbfdec901a48bbdb (diff)
downloadruby-15904793905a95859d6e9f44d4c91821d72b9dcb.tar.gz
fix use-after-free in obj_free.
* gc.c (obj_free): a table can be accessed for debug counters. [Bug #15165] [Fix GH-1964] A patch from Joe Truba <jtruba@meraki.com> Also check USE_DEBUG_COUNTER macro. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64857 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index 9a849dc9e8..4080c22b6c 100644
--- a/gc.c
+++ b/gc.c
@@ -2261,8 +2261,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
break;
case T_HASH:
if (RANY(obj)->as.hash.ntbl) {
- st_free_table(RANY(obj)->as.hash.ntbl);
-
+#if USE_DEBUG_COUNTER
if (RHASH_SIZE(obj) >= 8) {
RB_DEBUG_COUNTER_INC(obj_hash_ge8);
}
@@ -2272,6 +2271,8 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
else {
RB_DEBUG_COUNTER_INC(obj_hash_under4);
}
+#endif
+ st_free_table(RANY(obj)->as.hash.ntbl);
}
else {
RB_DEBUG_COUNTER_INC(obj_hash_empty);