diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-12-08 17:28:32 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-12-08 17:28:32 +0000 |
commit | e0f89c0a291f162c8092cd27cb21f1cfea66d842 (patch) | |
tree | 2730acc4fe71a77aff08be765d5d2b1afb8f77bc /gc.c | |
parent | da88b8603a2dae8d9c1257c9ea2a2ff4f7139acb (diff) | |
download | ruby-e0f89c0a291f162c8092cd27cb21f1cfea66d842.tar.gz |
gc.c: NULL check at memsize
* gc.c (rb_objspace_data_type_memsize): consider NULL data uses no
memory without calling dsize function as well as other functions.
fix SEGV in test/objspace with RUBY_ISEQ_DUMP_DEBUG=to_binary.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52979 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 12 |
1 files changed, 7 insertions, 5 deletions
@@ -1953,12 +1953,14 @@ rb_data_typed_object_zalloc(VALUE klass, size_t size, const rb_data_type_t *type size_t rb_objspace_data_type_memsize(VALUE obj) { - if (RTYPEDDATA_P(obj) && RTYPEDDATA_TYPE(obj)->function.dsize) { - return RTYPEDDATA_TYPE(obj)->function.dsize(RTYPEDDATA_DATA(obj)); - } - else { - return 0; + if (RTYPEDDATA_P(obj)) { + const rb_data_type_t *type = RTYPEDDATA_TYPE(obj); + const void *ptr = RTYPEDDATA_DATA(obj); + if (ptr && type->function.dsize) { + return type->function.dsize(ptr); + } } + return 0; } const char * |