diff --git a/msgpack/_packer.pyx b/msgpack/_packer.pyx index 94d1462c..4d0d2d21 100644 --- a/msgpack/_packer.pyx +++ b/msgpack/_packer.pyx @@ -38,7 +38,7 @@ cdef extern from "pack.h": int msgpack_pack_timestamp(msgpack_packer* x, long long seconds, unsigned long nanoseconds) except -1 -cdef int DEFAULT_RECURSE_LIMIT=511 +cdef int DEFAULT_RECURSE_LIMIT=1024 cdef long long ITEM_LIMIT = (2**32)-1 diff --git a/msgpack/fallback.py b/msgpack/fallback.py index d71bbfc7..1f2daf7b 100644 --- a/msgpack/fallback.py +++ b/msgpack/fallback.py @@ -52,7 +52,7 @@ def newlist_hint(size): TYPE_BIN = 4 TYPE_EXT = 5 -DEFAULT_RECURSE_LIMIT = 511 +DEFAULT_RECURSE_LIMIT = 1024 def _check_type_strict(obj, t, type=type, tuple=tuple): diff --git a/test/test_limits.py b/test/test_limits.py index 9b92b4d9..468c1c36 100644 --- a/test/test_limits.py +++ b/test/test_limits.py @@ -153,6 +153,30 @@ def test_auto_max_array_len(): unpacker.unpack() +def test_nest_limit_1024(): + import sys + + # Build a list nested 1024 levels deep + d = None + for _ in range(1024): + d = [d] + + # Temporarily raise Python's recursion limit so packing 1024 levels succeeds + old_limit = sys.getrecursionlimit() + sys.setrecursionlimit(max(old_limit, 10000)) + try: + packed = packb(d) + result = unpackb(packed) + finally: + sys.setrecursionlimit(old_limit) + + # Verify structure iteratively to avoid hitting C-level recursion limit in == + for _ in range(1024): + assert isinstance(result, list) and len(result) == 1 + result = result[0] + assert result is None + + def test_auto_max_map_len(): # len(packed) == 6 -> max_map_len == 3 packed = b"\xde\x00\x04zzz"