[ 
https://issues.apache.org/jira/browse/THRIFT-6100?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Dmytro Shteflyuk updated THRIFT-6100:
-------------------------------------
    Component/s: Ruby - Library

> Ruby MemoryBufferTransport should respect frozen destination buffers
> --------------------------------------------------------------------
>
>                 Key: THRIFT-6100
>                 URL: https://issues.apache.org/jira/browse/THRIFT-6100
>             Project: Thrift
>          Issue Type: Bug
>          Components: Ruby - Library
>            Reporter: Dmytro Shteflyuk
>            Assignee: Dmytro Shteflyuk
>            Priority: Major
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> 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