From 1c5ad91724755e0cf9f82dac6101fe36f7499b11 Mon Sep 17 00:00:00 2001 From: Aaditya Srinivasan Date: Mon, 22 Jun 2026 16:52:58 +0530 Subject: [PATCH 1/3] GH-45187: [Ruby] Ensure initializing all rb_memory_view_t members --- ruby/red-arrow/ext/arrow/memory-view.cpp | 9 ++--- ruby/red-arrow/test/test-memory-view.rb | 51 ++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/ruby/red-arrow/ext/arrow/memory-view.cpp b/ruby/red-arrow/ext/arrow/memory-view.cpp index a3135310c97d..982b8f10ae4c 100644 --- a/ruby/red-arrow/ext/arrow/memory-view.cpp +++ b/ruby/red-arrow/ext/arrow/memory-view.cpp @@ -32,6 +32,7 @@ #endif #include +#include namespace red_arrow { namespace memory_view { @@ -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..676e9268b0e0 100644 --- a/ruby/red-arrow/test/test-memory-view.rb +++ b/ruby/red-arrow/test/test-memory-view.rb @@ -431,4 +431,55 @@ 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) + size = 256 # We should use sizeof(rb_memory_view_t) but it isn't available from Ruby. + 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 From 1a9fbd2cd45dbfe69e274c1d5a6146e48223615e Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Tue, 23 Jun 2026 15:17:45 +0900 Subject: [PATCH 2/3] One more note --- ruby/red-arrow/test/test-memory-view.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ruby/red-arrow/test/test-memory-view.rb b/ruby/red-arrow/test/test-memory-view.rb index 676e9268b0e0..8aa5728a56a4 100644 --- a/ruby/red-arrow/test/test-memory-view.rb +++ b/ruby/red-arrow/test/test-memory-view.rb @@ -456,7 +456,9 @@ def setup end def assert_release(target) - size = 256 # We should use sizeof(rb_memory_view_t) but it isn't available from Ruby. + # 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 From c4496b0772db16fbca2957c7232e47f9c48cdcf7 Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Tue, 23 Jun 2026 15:18:20 +0900 Subject: [PATCH 3/3] Sort --- ruby/red-arrow/ext/arrow/memory-view.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/red-arrow/ext/arrow/memory-view.cpp b/ruby/red-arrow/ext/arrow/memory-view.cpp index 982b8f10ae4c..3869b45583d8 100644 --- a/ruby/red-arrow/ext/arrow/memory-view.cpp +++ b/ruby/red-arrow/ext/arrow/memory-view.cpp @@ -31,8 +31,8 @@ # undef private #endif -#include #include +#include namespace red_arrow { namespace memory_view {