diff --git a/ruby/red-arrow/ext/arrow/memory-view.cpp b/ruby/red-arrow/ext/arrow/memory-view.cpp index a3135310c97d..3869b45583d8 100644 --- a/ruby/red-arrow/ext/arrow/memory-view.cpp +++ b/ruby/red-arrow/ext/arrow/memory-view.cpp @@ -31,6 +31,7 @@ # undef private #endif +#include #include namespace red_arrow { @@ -220,6 +221,7 @@ namespace red_arrow { return false; } auto view_ = reinterpret_cast(view); + memset(view_, 0, sizeof(memory_view)); view_->obj = obj; view_->private_data = new PrivateData(); auto array = GARROW_ARRAY(RVAL2GOBJ(obj)); @@ -231,9 +233,6 @@ namespace red_arrow { } view_->readonly = true; view_->ndim = 1; - view_->shape = NULL; - view_->strides = NULL; - view_->sub_offsets = NULL; return true; } @@ -258,6 +257,7 @@ namespace red_arrow { return false; } auto view_ = reinterpret_cast(view); + memset(view_, 0, sizeof(memory_view)); view_->obj = obj; auto buffer = GARROW_BUFFER(RVAL2GOBJ(obj)); auto arrow_buffer = garrow_buffer_get_raw(buffer); @@ -275,9 +275,6 @@ namespace red_arrow { view_->byte_size = arrow_buffer->size(); view_->readonly = true; view_->ndim = 1; - view_->shape = NULL; - view_->strides = NULL; - view_->sub_offsets = NULL; return true; } diff --git a/ruby/red-arrow/test/test-memory-view.rb b/ruby/red-arrow/test/test-memory-view.rb index 0b9c98c407f4..8aa5728a56a4 100644 --- a/ruby/red-arrow/test/test-memory-view.rb +++ b/ruby/red-arrow/test/test-memory-view.rb @@ -431,4 +431,57 @@ def little_endian? ]) end end + + sub_test_case("uninitialized rb_memory_view_t") do + def setup + libruby = Fiddle.dlopen(nil) + + @rb_memory_view_get = Fiddle::Function.new( + libruby["rb_memory_view_get"], + [ + Fiddle::TYPE_UINTPTR_T, + Fiddle::TYPE_VOIDP, + Fiddle::TYPE_INT, + ], + Fiddle::TYPE_BOOL + ) + + @rb_memory_view_release = Fiddle::Function.new( + libruby["rb_memory_view_release"], + [ + Fiddle::TYPE_VOIDP, + ], + Fiddle::TYPE_BOOL + ) + end + + def assert_release(target) + # We should use sizeof(rb_memory_view_t) but it isn't available from Ruby. + # 256 must be larger than sizeof(rb_memory_view_t). + size = 256 + Fiddle::Pointer.malloc(size, Fiddle::RUBY_FREE) do |view| + size.times do |i| + view[i] = 0xAA + end + + assert do + @rb_memory_view_get.call(Fiddle.dlwrap(target), view, 0) + end + + assert do + @rb_memory_view_release.call(view) + end + end + end + + test("Int32Array") do + array = Arrow::Int32Array.new([1, 2, 3, 4, 5]) + assert_release(array) + end + + test("Buffer") do + buffer = Arrow::Buffer.new("hello") + assert_release(buffer) + end + end end