summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-10 15:20:35 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-10 15:20:35 +0000
commit482bf1959a257813728cc7b13a9ff698590fec44 (patch)
tree89e25c2fecb828b797ad7faa57bfd8a1f8c13616 /gc.c
parent3875df97f1ff78c376543a2c3cb32ab6aada69bc (diff)
ruby.h: fix possible memory leak
* include/ruby/ruby.h (Data_Make_Struct, TypedData_Make_Struct): allocate wrapper data object before allocating DATA_PTR to get rid of possible memory leak when the former failed. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50464 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/gc.c b/gc.c
index 3b2d5c9519..53c0ec5dd4 100644
--- a/gc.c
+++ b/gc.c
@@ -1813,12 +1813,28 @@ rb_data_object_alloc(VALUE klass, void *datap, RUBY_DATA_FUNC dmark, RUBY_DATA_F
}
VALUE
+rb_data_object_zalloc(VALUE klass, size_t size, RUBY_DATA_FUNC dmark, RUBY_DATA_FUNC dfree)
+{
+ VALUE obj = rb_data_object_alloc(klass, 0, dmark, dfree);
+ DATA_PTR(obj) = xcalloc(1, size);
+ return obj;
+}
+
+VALUE
rb_data_typed_object_alloc(VALUE klass, void *datap, const rb_data_type_t *type)
{
if (klass) Check_Type(klass, T_CLASS);
return newobj_of(klass, T_DATA | (type->flags & ~T_MASK), (VALUE)type, (VALUE)1, (VALUE)datap);
}
+VALUE
+rb_data_typed_object_zalloc(VALUE klass, size_t size, const rb_data_type_t *type)
+{
+ VALUE obj = rb_data_typed_object_alloc(klass, 0, type);
+ DATA_PTR(obj) = xcalloc(1, size);
+ return obj;
+}
+
size_t
rb_objspace_data_type_memsize(VALUE obj)
{