Skip to content

Commit 47be73d

Browse files
authored
Make to_str consistent between backends for negative pointer sizes (#184)
Also added more tests for the current behavior. ```ruby require "fiddle" ptr = Fiddle::Pointer["hello\0world"] ptr.size = 0 p (ptr + 1).size p (ptr + 1).to_s(5) p (ptr + 1).to_s p (ptr + 1).to_str(5) p (ptr + 1).to_str ``` Output ```text -1 "ello\x00" "ello" "ello\x00" repro.rb:10:in 'Fiddle::Pointer#to_str': negative string size (or size too big) (ArgumentError) ```
1 parent 8eab55b commit 47be73d

File tree

2 files changed

+10
-0
lines changed

2 files changed

+10
-0
lines changed

lib/fiddle/ffi_backend.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,9 @@ def to_str(len = nil)
432432
if len
433433
ffi_ptr.read_string(len)
434434
else
435+
if @size < 0
436+
raise ArgumentError.new("negative string size (or size too big)")
437+
end
435438
ffi_ptr.read_string(@size)
436439
end
437440
rescue FFI::NullPointerError

test/fiddle/test_pointer.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ def test_to_str
8484

8585
ptr.size = 0
8686
assert_equal "", ptr.to_str
87+
assert_equal "ello\0", (ptr + 1).to_str(5)
88+
assert_raise(ArgumentError) do
89+
(ptr + 1).to_str
90+
end
8791
end
8892

8993
def test_to_s
@@ -99,6 +103,8 @@ def test_to_s
99103

100104
ptr.size = 0
101105
assert_equal "hello", ptr.to_s
106+
assert_equal "ello\0", (ptr + 1).to_s(5)
107+
assert_equal "ello", (ptr + 1).to_s
102108
end
103109

104110
def test_minus
@@ -264,6 +270,7 @@ def test_size
264270
end
265271
assert_equal 0, Pointer.new(0).size
266272
assert_equal 0, Pointer.new(0).ref.size
273+
assert_equal -1, (Pointer.new(0) + 1).size
267274
end
268275

269276
def test_size=

0 commit comments

Comments
 (0)