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

Dmytro Shteflyuk resolved THRIFT-6103.
--------------------------------------
    Resolution: Fixed

> Ruby MemoryBufferTransport should return unsigned byte values
> -------------------------------------------------------------
>
>                 Key: THRIFT-6103
>                 URL: https://issues.apache.org/jira/browse/THRIFT-6103
>             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_byte}} 
> stores the next byte in a plain C {{char}} before returning it to Ruby.
> On platforms where {{char}} is signed, bytes with the high bit set are 
> sign-extended. For example, {{0x80}} is returned as {{-128}} and {{0xff}} as 
> {{-1}}. The pure-Ruby implementation returns the normal unsigned byte values, 
> {{128}} and {{255}}.
> h3. Client impact
> Ruby clients that call {{MemoryBufferTransport#read_byte}} directly can 
> receive different values depending on whether {{thrift_native}} is available 
> and on the platform's C {{char}} representation.
> This affects custom protocol code and other transport consumers that 
> interpret bytes as values in the {{0..255}} range. Higher-level protocol 
> readers often normalize or mask their input, which is why ordinary 
> serialization can continue to work despite the inconsistent transport 
> contract.
> h3. Reproduction
> {code:ruby}
> require "thrift"
> transport = Thrift::MemoryBufferTransport.new([0x80, 0xff].pack("C*"))
> p [transport.read_byte, transport.read_byte]
> {code}
> With the native extension on a platform with signed C {{char}}, this prints:
> {code}
> [-128, -1]
> {code}
> Without the native extension, it prints:
> {code}
> [128, 255]
> {code}
> h3. Expected behavior
> {{MemoryBufferTransport#read_byte}} should consistently return unsigned byte 
> values from {{0}} through {{255}}. In particular, {{0x00}}, {{0x7f}}, 
> {{0x80}}, and {{0xff}} should return {{0}}, {{127}}, {{128}}, and {{255}} in 
> both native and pure-Ruby modes.



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

Reply via email to