Dmytro Shteflyuk created THRIFT-6101:
----------------------------------------

             Summary: 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
            Reporter: Dmytro Shteflyuk
            Assignee: Dmytro Shteflyuk


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