summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorhimura467 <akitoshitara@gmail.com>2026-05-14 14:24:44 +0900
committerSutou Kouhei <kou@cozmixng.org>2026-05-15 09:58:18 +0900
commit2552db04ddc44349c7b0f5f93aeb0fb02eccb509 (patch)
tree8dbfca42b0e56a62f241c16555c6f550870f8182 /test
parent356c0cd0e7953baafd240914476213566f526c85 (diff)
Fix UAF in IO::Buffer#& when self or mask is an invalidated slice
Diffstat (limited to 'test')
-rw-r--r--test/ruby/test_io_buffer.rb18
1 files changed, 18 insertions, 0 deletions
diff --git a/test/ruby/test_io_buffer.rb b/test/ruby/test_io_buffer.rb
index 6213bb28d7..50eb1a08e3 100644
--- a/test/ruby/test_io_buffer.rb
+++ b/test/ruby/test_io_buffer.rb
@@ -702,6 +702,24 @@ class TestIOBuffer < Test::Unit::TestCase
assert_equal IO::Buffer.for("\xce\xcd\xcc\xcb\xce\xcd\xcc\xcb\xce\xcd"), source.dup.not!
end
+ def test_and_raises_on_freed_self
+ inner = IO::Buffer.new(IO::Buffer::PAGE_SIZE)
+ slice = inner.slice(0, 8)
+ inner.free
+
+ mask = IO::Buffer.for("ABCDEFGH")
+ assert_raise(IO::Buffer::InvalidatedError) { slice & mask }
+ end
+
+ def test_and_raises_on_freed_mask
+ inner = IO::Buffer.new(IO::Buffer::PAGE_SIZE)
+ mask_slice = inner.slice(0, 8)
+ inner.free
+
+ source = IO::Buffer.for("ABCDEFGH")
+ assert_raise(IO::Buffer::InvalidatedError) { source & mask_slice }
+ end
+
def test_bit_count
# All ones: 8 bits set per byte
assert_equal 8, IO::Buffer.for("\xFF").bit_count