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

Jens Geyer resolved THRIFT-6168.
--------------------------------
    Resolution: Fixed

> Add recursion depth limit to skip() in D library
> ------------------------------------------------
>
>                 Key: THRIFT-6168
>                 URL: https://issues.apache.org/jira/browse/THRIFT-6168
>             Project: Thrift
>          Issue Type: Bug
>          Components: D - Library
>            Reporter: Jens Geyer
>            Assignee: Jens Geyer
>            Priority: Major
>             Fix For: 0.25.0
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> The skip() free function in the D library (lib/d/src/thrift/protocol/base.d) 
> recurses through nested structs, lists, maps and sets without a depth bound. 
> A deeply nested payload can exhaust the call stack.
> The counter that bounds struct read/write recursion (THRIFT-6053) is 
> module-private to thrift.codegen.base, which imports thrift.protocol.base and 
> not the other way round, so skip() cannot reach it. skip() is called before 
> dispatch from the generated processor (lib/d/src/thrift/codegen/processor.d, 
> on an unexpected message type and on an unknown method name), and from the 
> generated struct readers for unknown fields.
> Move the counter and the DEFAULT_MAX_RECURSION_DEPTH constant to 
> thrift.protocol.base and have skip() draw on the same budget, matching what 
> C++ (TInputRecursionTracker), Java, netstd, Delphi, Haxe, Lua, Perl, PHP, 
> Smalltalk and OCaml already do; a nested payload is then rejected with 
> TProtocolException.Type.DEPTH_LIMIT.
> D is the last binding whose skip() is unbounded (compare THRIFT-6013 for 
> Ruby, THRIFT-6014 for JavaScript, THRIFT-6164 for Erlang).



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

Reply via email to