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

Dmytro Shteflyuk resolved THRIFT-6101.
--------------------------------------
    Fix Version/s: 0.25.0
       Resolution: Fixed

> Ruby CompactProtocol should use Ruby truthiness when writing booleans
> ---------------------------------------------------------------------
>
>                 Key: THRIFT-6101
>                 URL: https://issues.apache.org/jira/browse/THRIFT-6101
>             Project: Thrift
>          Issue Type: Bug
>          Components: Ruby - Library
>            Reporter: Dmytro Shteflyuk
>            Assignee: Dmytro Shteflyuk
>            Priority: Major
>             Fix For: 0.25.0
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> h3. Problem
> The native and pure-Ruby implementations of 
> {{Thrift::CompactProtocol#write_bool}} interpret values differently.
> The pure-Ruby implementation follows normal Ruby truthiness: only {{false}} 
> and {{nil}} encode as false. The native implementation recognizes only the 
> literal {{true}} as true, so other truthy Ruby values such as {{0}}, {{1}}, 
> and arbitrary objects encode as false.
> h3. Client impact
> Ruby clients can produce different serialized data depending on whether 
> {{thrift_native}} is loaded. A truthy non-boolean value passed through 
> dynamic application code, a wrapper, or a hand-written protocol call is 
> encoded as true in pure-Ruby environments but false in native environments.
> This makes the value placed on the wire dependent on the client’s runtime 
> configuration.
> h3. Reproduction
> {code:ruby}
> require "thrift"
> transport = Thrift::MemoryBufferTransport.new
> protocol = Thrift::CompactProtocol.new(transport)
> protocol.write_bool(0)
> puts transport.read_byte
> {code}
> With {{thrift_native}} loaded, this writes the compact-protocol false marker, 
> {{0x02}}. Without the native extension, it writes the true marker, {{0x01}}, 
> because {{0}} is truthy in Ruby.
> h3. Expected behavior
> Native and pure-Ruby CompactProtocol implementations should follow the same 
> Ruby truthiness semantics. {{false}} and {{nil}} should encode as false; 
> {{true}}, numbers, and other objects should encode as true.



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

Reply via email to