[
https://issues.apache.org/jira/browse/THRIFT-6058?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jens Geyer resolved THRIFT-6058.
--------------------------------
Fix Version/s: 0.24.0
Resolution: Fixed
> Rust codegen: `list<UnionType>` deserialization generates shadowed variable
> and missing Box wrapping
> ----------------------------------------------------------------------------------------------------
>
> Key: THRIFT-6058
> URL: https://issues.apache.org/jira/browse/THRIFT-6058
> Project: Thrift
> Issue Type: Bug
> Components: Rust - Library
> Reporter: Santiago Medina
> Priority: Major
> Fix For: 0.24.0
>
> Time Spent: 40m
> Remaining Estimate: 0h
>
> Bug: Rust code generator produces incorrect deserialization code for
> list<UnionType> and set<UnionType> fields
> The Rust code generator (t_rs_generator) is producing broken deserialization
> code when a struct contains a list<UnionType> or set<UnionType> field.
> Affected code locations:
> - t_rs_generator::render_list_sync_read (line 2016)
> - t_rs_generator::render_set_sync_read (line 2051)
> Incorrect code currently generated:
> match UnionType::read_from_in_protocol(i_prot) {
> Ok(val) => \{ val.push(val); },
> ...
> }
> Two bugs:
> 1. Variable shadowing – the match binding "val" shadows the outer list/set
> variable "val", so val.push(val) tries to call push on the union value itself
> (which doesn't exist).
> 2. Missing Box::new() – the field type is Vec<Box<UnionType>> (or
> BTreeSet<Box<UnionType>>), but the code does not wrap the deserialized
> element in Box::new().
> Correct code should be:
> match UnionType::read_from_in_protocol(i_prot) {
> Ok(elem) => \{ val.push(Box::new(elem)); },
> ...
> }
> Note: The single-field deserialization path (render_struct_sync_read line
> 1718) correctly does the boxing, but the list/set collection paths do not.
> Reproduction steps:
> 1. Create any .thrift file with a union type.
> 2. Use that union inside a list or set field in a struct.
> Example .thrift:
> union MyUnion {
> 1: i32 int_value
> 2: string string_value
> }
> struct MyStruct {
> 3: optional list<MyUnion> items
> 4: optional set<MyUnion> unique_items
> }
> This results in compilation errors in the generated Rust code.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)