[ https://issues.apache.org/jira/browse/THRIFT-2420?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jens Geyer resolved THRIFT-2420. -------------------------------- Resolution: Fixed Assignee: Jens Geyer Committed, thanks for spotting this. > Go argument parser for methods without arguments does not skip fields > --------------------------------------------------------------------- > > Key: THRIFT-2420 > URL: https://issues.apache.org/jira/browse/THRIFT-2420 > Project: Thrift > Issue Type: Bug > Components: Go - Compiler > Affects Versions: 0.9.2 > Environment: All > Reporter: Frank Schroeder > Assignee: Jens Geyer > Fix For: 0.9.2 > > Attachments: THRIFT-2420-with-indentation.patch, > THRIFT-2420_skip_field_missing-v2.patch > > Original Estimate: 1h > Remaining Estimate: 1h > > The Read() method of a struct of a thrift function which does not have > arguments (e.g. foo()) calls iprot.ReadFieldBegin() to read the field type > but does not consume/skip a field which it was not expecting. > Read() methods for argument parsers for methods which have arguments have the > correct code in the default section of the switch statement. > This is the current code (I've added where the iprot.Skip() call is missing): > {code} > func (p *GetVersionDataArgs) Read(iprot thrift.TProtocol) error { > if _, err := iprot.ReadStructBegin(); err != nil { > return fmt.Errorf("%T read error: %s", p, err) > } > for { > _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() > if err != nil { > return fmt.Errorf("%T field %d read error: %s", p, > fieldId, err) > } > if fieldTypeId == thrift.STOP { > break > } > // should call iprot.Skip(fieldTypeId) if not STOP > if err := iprot.ReadFieldEnd(); err != nil { > return err > } > } > if err := iprot.ReadStructEnd(); err != nil { > return fmt.Errorf("%T read struct end error: %s", p, err) > } > return nil > } > {code} > After the check for {{thrift.STOP}} there needs to be this code > {code} > if err := iprot.Skip(fieldTypeId); err != nil { > return err > } > {code} > We've found this because on the Java side we dynamically inject fields into > the struct on call which are ignored on the Go side as long as the function > has arguments. When we make a call to the no-argument function some bytes are > not consumed and make the thrift code go out of sync. > I will attach a patch which fixes this. -- This message was sent by Atlassian JIRA (v6.2#6252)