Dmytro Shteflyuk created THRIFT-6146:
----------------------------------------

             Summary: Ruby processor should validate request message types
                 Key: THRIFT-6146
                 URL: https://issues.apache.org/jira/browse/THRIFT-6146
             Project: Thrift
          Issue Type: Bug
          Components: Ruby - Library
            Reporter: Dmytro Shteflyuk
            Assignee: Dmytro Shteflyuk


h3. Problem

The Ruby base processor dispatches an incoming message based on its function 
name without first validating the message-envelope type. As a result, envelopes 
marked as {{REPLY}} or {{EXCEPTION}} can be routed to a generated server method 
as though they were requests.

The Ruby multiplexed processor already limits request dispatch to {{CALL}} and 
{{ONEWAY}}, but the base processor does not apply the same validation.

h3. Client impact

A malformed or misrouted envelope can reach generated argument parsing and 
invoke a server handler instead of being reported as an invalid request message 
type. The response envelope may also be absent or inconsistent because the 
processor believes normal method dispatch succeeded.

h3. Reproduction

Run the following from {{lib/rb}}:

{code:ruby}
require "thrift"

processor_class = Class.new do
  include Thrift::Processor

  attr_reader :dispatched_seqid

  def process_work(seqid, _iprot, _oprot)
    @dispatched_seqid = seqid
    true
  end
end

input = Thrift::MemoryBufferTransport.new
writer = Thrift::BinaryProtocol.new(input)
writer.write_message_begin("work", Thrift::MessageTypes::REPLY, 11)
writer.write_struct_begin("work_result")
writer.write_field_stop
writer.write_struct_end
writer.write_message_end

output = Thrift::MemoryBufferTransport.new
processor = processor_class.new(Object.new)
result = processor.process(
  Thrift::BinaryProtocol.new(input),
  Thrift::BinaryProtocol.new(output)
)

puts "result=#{result} dispatched_seqid=#{processor.dispatched_seqid} 
response_bytes=#{output.available}"
{code}

Testing on master commit {{c2def39207a73394420088da9b4b105571dd9036}} produces:

{code}
result=true dispatched_seqid=11 response_bytes=0
{code}

The {{REPLY}} envelope is dispatched to {{process_work}}, and no error response 
is written.

h3. Expected behavior

The base processor should dispatch only {{CALL}} and {{ONEWAY}} envelopes. 
Other message types should not invoke a generated handler. They should be 
consumed and reported using an {{ApplicationException}} with type 
{{INVALID_MESSAGE_TYPE}}, while preserving the message name and sequence ID in 
the error response.




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

Reply via email to