From 766ff5a6bd860a53dc72f07196d1a86f29cae8fc Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Tue, 22 Apr 2025 00:05:26 -0700 Subject: [PATCH] Make Fiddle::Pointer#to_str consistent between backends for negative pointer sizes --- lib/fiddle/ffi_backend.rb | 3 +++ test/fiddle/test_pointer.rb | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/lib/fiddle/ffi_backend.rb b/lib/fiddle/ffi_backend.rb index fc1746fd..f6b3d12f 100644 --- a/lib/fiddle/ffi_backend.rb +++ b/lib/fiddle/ffi_backend.rb @@ -432,6 +432,9 @@ def to_str(len = nil) if len ffi_ptr.read_string(len) else + if @size < 0 + raise ArgumentError.new("negative string size (or size too big)") + end ffi_ptr.read_string(@size) end rescue FFI::NullPointerError diff --git a/test/fiddle/test_pointer.rb b/test/fiddle/test_pointer.rb index 6f086f00..73f163d4 100644 --- a/test/fiddle/test_pointer.rb +++ b/test/fiddle/test_pointer.rb @@ -84,6 +84,10 @@ def test_to_str ptr.size = 0 assert_equal "", ptr.to_str + assert_equal "ello\0", (ptr + 1).to_str(5) + assert_raise(ArgumentError) do + (ptr + 1).to_str + end end def test_to_s @@ -99,6 +103,8 @@ def test_to_s ptr.size = 0 assert_equal "hello", ptr.to_s + assert_equal "ello\0", (ptr + 1).to_s(5) + assert_equal "ello", (ptr + 1).to_s end def test_minus @@ -264,6 +270,7 @@ def test_size end assert_equal 0, Pointer.new(0).size assert_equal 0, Pointer.new(0).ref.size + assert_equal -1, (Pointer.new(0) + 1).size end def test_size=