mirror of
https://github.com/apache/thrift.git
synced 2026-10-29 08:55:16 +08:00
Client: lua The Lua generator wraps each generated read()/write() body with incrementRecursionDepth()/pcall/decrementRecursionDepth() on TProtocolBase (limit DEFAULT_RECURSION_DEPTH = 64, TProtocolException.DEPTH_LIMIT on excess). Previously only skip() was bounded, so the generated read/write path recursed without limit. Unions and exceptions are generated through the same path, so they are bounded too. Replace the isolated counter test with a generated-code round-trip (lib/lua/test/test_recursion_depth.lua) over a recursive struct (RecTree), union (RecUnion) and exception (RecError) from a new RecursionDepth.thrift, driven through the generated read()/write() over a real TBinaryProtocol: a chain at the limit round-trips (also proving the guard does not double-count), a chain past it is rejected on write, and a hand-serialized over-limit payload is rejected on read (crafted with the real recursive field, id 1 = list<self>, so the reader recurses through the guarded path rather than the separate, unbounded skip()). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
38 lines
1.2 KiB
Thrift
38 lines
1.2 KiB
Thrift
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
// A self-referential struct, union and exception used to exercise the
|
|
// recursion-depth guard in the generated read()/write() code. Recursion runs
|
|
// through a list<self> so the types are expressible (no by-value cycle).
|
|
|
|
struct RecTree {
|
|
1: list<RecTree> children
|
|
2: i16 item
|
|
}
|
|
|
|
union RecUnion {
|
|
1: list<RecUnion> children
|
|
2: i32 leaf
|
|
}
|
|
|
|
exception RecError {
|
|
1: list<RecError> children
|
|
2: i32 leaf
|
|
}
|