summaryrefslogtreecommitdiff
path: root/ruby
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2010-06-29 14:54:40 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2010-06-29 14:56:23 +0900
commit34a29cd0a50eea4a0e008fe3947c86179d536540 (patch)
tree55f0effd5ca124c95f1d2b8d0e1eaf3a6bda0bb0 /ruby
parent9fffa9800ae4b09180d2b892f1f70215534a874b (diff)
downloadmsgpack-python-34a29cd0a50eea4a0e008fe3947c86179d536540.tar.gz
ruby: fixes SEGV problem caused by GC bug at MessagePack_Unpacker_mark.
Diffstat (limited to 'ruby')
-rw-r--r--ruby/test/test_helper.rb1
-rw-r--r--ruby/unpack.c18
2 files changed, 14 insertions, 5 deletions
diff --git a/ruby/test/test_helper.rb b/ruby/test/test_helper.rb
index 19226ef..bf9fee8 100644
--- a/ruby/test/test_helper.rb
+++ b/ruby/test/test_helper.rb
@@ -5,3 +5,4 @@ rescue LoadError
require File.dirname(__FILE__) + '/../lib/msgpack'
end
+GC.stress = true
diff --git a/ruby/unpack.c b/ruby/unpack.c
index 151dbf4..0948151 100644
--- a/ruby/unpack.c
+++ b/ruby/unpack.c
@@ -287,6 +287,7 @@ static void MessagePack_Unpacker_mark(msgpack_unpack_t *mp)
unsigned int i;
rb_gc_mark(mp->user.stream);
rb_gc_mark(mp->user.streambuf);
+ rb_gc_mark_maybe(template_data(mp));
for(i=0; i < mp->top; ++i) {
rb_gc_mark(mp->stack[i].obj);
rb_gc_mark_maybe(mp->stack[i].map_key);
@@ -297,6 +298,17 @@ static VALUE MessagePack_Unpacker_alloc(VALUE klass)
{
VALUE obj;
msgpack_unpack_t* mp = ALLOC_N(msgpack_unpack_t, 1);
+
+ // rb_gc_mark (not _maybe) is used for following member objects.
+ mp->user.stream = Qnil;
+ mp->user.streambuf = Qnil;
+
+ mp->user.finished = 0;
+ mp->user.offset = 0;
+ mp->user.buffer.size = 0;
+ mp->user.buffer.free = 0;
+ mp->user.buffer.ptr = NULL;
+
obj = Data_Wrap_Struct(klass, MessagePack_Unpacker_mark,
MessagePack_Unpacker_free, mp);
return obj;
@@ -343,14 +355,10 @@ static VALUE MessagePack_Unpacker_initialize(int argc, VALUE *argv, VALUE self)
UNPACKER(self, mp);
template_init(mp);
- mp->user.finished = 0;
- mp->user.offset = 0;
- mp->user.buffer.size = 0;
- mp->user.buffer.free = 0;
- mp->user.buffer.ptr = NULL;
mp->user.stream = stream;
mp->user.streambuf = rb_str_buf_new(MSGPACK_UNPACKER_BUFFER_RESERVE_SIZE);
mp->user.stream_append_method = append_method_of(stream);
+
return self;
}