Nested slices, which can be obtained by `buffer.slice.slice` now, have been introduced in commit:5f5d655 / [GH #19091](https://github.com/ruby/ruby/pull/19091), and they have a significant performance drawback as they require an O(depth)...hanazuki (Kasumi Hanazuki)
IO::Buffer gained support for reading and writing 128-bit integers (:u128, :U128, :s128, and :S128) in Ruby 4.0 (commit:a7dc53b91c8475323b34d5a332fdb25d190e277d). Unlike the other smaller integer types, IO::Buffer#set_value does not cal...hanazuki (Kasumi Hanazuki)
When an installed Fiber scheduler raises from its I/O hook, the temporary IO::Buffer passed to the hook is left unfreed. The buffer may then outlive the memory it wraps, so accessing it afterward can cause undefined behavior. This onl...hanazuki (Kasumi Hanazuki)
IO::Buffer#locked: Release lock even when the block raises/breaks Previously, `IO::Buffer#locked` leaks the lock when the block raises an exception, or breaks. Fixes: [Bug #21882]hanazuki (Kasumi Hanazuki)
The block passed to `IO::Buffer#each` can free or resize the receiver (or its parent buffer when the reciver is a slice), which invalidates the memory region being iterated. The next iteration causes use-after-free.
Applied in changeset commit:git|b5ccab2093c9bb19ae8564a935e6fd72ec7354cc. ---------- IO::Buffer#locked: Release lock even when the block raises (#16180) IO::Buffer#locked: Release lock even when the block raises/breaks Previously, `IO...hanazuki (Kasumi Hanazuki)
IO::Buffer#locked: Release lock even when the block raises/breaks Previously, `IO::Buffer#locked` leaks the lock when the block raises an exception, or breaks. Fixes: [Bug #21882]hanazuki (Kasumi Hanazuki)
```ruby # Assume this file is on a very slow device such as NFS. io = File.open('/mnt/slowfs/slow') buf = IO::Buffer.new(100) t1 = Thread.new do buf.locked do sleep 0.5 end buf.free end t2 = Thread.new do b...hanazuki (Kasumi Hanazuki)