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

Jens Geyer resolved THRIFT-6328.
--------------------------------
      Assignee: Jens Geyer
    Resolution: Fixed

> Smalltalk: generated recv methods read the message envelope from the output 
> protocol
> ------------------------------------------------------------------------------------
>
>                 Key: THRIFT-6328
>                 URL: https://issues.apache.org/jira/browse/THRIFT-6328
>             Project: Thrift
>          Issue Type: Bug
>          Components: Compiler (General)
>            Reporter: Jens Geyer
>            Assignee: Jens Geyer
>            Priority: Minor
>             Fix For: 0.26.0
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> h2. Problem
> {{TClient}} keeps two protocols, {{iprot}} and {{oprot}}, and offers 
> {{inProtocol:}} and {{outProtocol:}} so that a client can read and write over 
> different ones.
> The generated {{recv}} methods read from the wrong one. 
> {{generate_recv_method}} in 
> {{compiler/cpp/src/thrift/generate/t_st_generator.cc}} emits:
> {code}
> msg := oprot readMessageBegin.
> self validateRemoteMessage: msg.
> res := [ ... iprot readStructBegin ... ] value.
> oprot readMessageEnd.
> oprot transport flush.
> {code}
> The message envelope is read from {{oprot}} while the struct inside it is 
> read from {{iprot}}, in the same method.
> h2. Why it usually works
> {{TClient>>inProtocol:}} is
> {code}
> inProtocol: aProtocol
>       iprot := aProtocol.
>       oprot ifNil: [oprot := aProtocol]
> {code}
> so a client built the usual way has {{oprot}} and {{iprot}} pointing at the 
> same object, and reading the envelope from either is the same thing.
> A client that calls {{outProtocol:}} with a different protocol - which is the 
> only reason that setter exists - reads the envelope from the protocol it 
> writes to, and the body from the one the peer is answering on. It cannot work.
> h2. Fix
> Read with {{iprot}}. The flush belongs on the write side and stays on 
> {{oprot}}.
> THRIFT-6062 fixed the mirror image of this on the write side: {{write_val}} 
> emitted {{iprot write...}} for base types and enums while the rest of the 
> write path used {{oprot}}.
> _Drafted with AI assistance (Claude Opus 5); reviewed and posted by Jens 
> Geyer._



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

Reply via email to