Dmytro Shteflyuk created THRIFT-6100:
----------------------------------------

             Summary: Ruby MemoryBufferTransport should respect frozen 
destination buffers
                 Key: THRIFT-6100
                 URL: https://issues.apache.org/jira/browse/THRIFT-6100
             Project: Thrift
          Issue Type: Bug
            Reporter: Dmytro Shteflyuk
            Assignee: Dmytro Shteflyuk


h3. Problem

The native implementation of {{Thrift::MemoryBufferTransport#read_into_buffer}} 
writes directly into the destination string without first asking Ruby to make 
the string mutable.

As a result, a frozen destination string can be modified when {{thrift_native}} 
is loaded. The pure-Ruby implementation follows normal Ruby string semantics 
and raises {{FrozenError}} instead.

h3. Client impact

This affects Ruby clients using {{MemoryBufferTransport}} with the native 
extension. Code that freezes a destination string can reasonably expect that 
object to remain unchanged, but a positive-length native read can currently 
overwrite it and consume input from the transport.

The behavior also differs depending on whether the native extension is 
available.

h3. Reproduction

{code:ruby}
require "thrift"

transport = Thrift::MemoryBufferTransport.new("ab")
destination = "xy".freeze

transport.read_into_buffer(destination, 2)
{code}

With the native extension loaded, the call can succeed and change 
{{destination}} to {{"ab"}}. Without the extension, Ruby raises {{FrozenError}}.

h3. Expected behavior

A positive-length read into a frozen string should raise {{FrozenError}} before 
either the destination or the transport is modified.

A zero-length read should remain a no-op: it should return zero without 
modifying the destination, consuming input, or raising {{FrozenError}}.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to