traverse_trees(): respect max_allowed_tree_depth
commitf1f63a481bcaaa2124b5f0395abec6b457888bf1
authorJeff King <peff@peff.net>
Thu, 31 Aug 2023 06:21:40 +0000 (31 02:21 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 31 Aug 2023 22:51:08 +0000 (31 15:51 -0700)
tree033c6b47b96feac566ae26cd8dcd3caf0bff3f34
parentbe20128bfa5423503081ba1884e5367c91849d9e
traverse_trees(): respect max_allowed_tree_depth

The tree-walk.c code walks trees recursively, and may run out of stack
space. The easiest way to see this is with git-archive; on my 64-bit
Linux system it runs out of stack trying to generate a tarfile with a
tree depth of 13,772.

I've picked 4100 as the depth for our "big" test. I ran it with a much
higher value to confirm that we do get a segfault without this patch.
But really anything over 4096 is sufficient for its stated purpose,
which is to find out if our default limit of 4096 is low enough to
prevent segfaults on all platforms. Keeping it small saves us time on
the test setup.

The tree-walk code that's touched here underlies unpack_trees(), so this
protects any programs which use it, not just git-archive (but archive is
easy to test, and was what alerted me to this issue in a real-world
case).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t6700-tree-depth.sh [new file with mode: 0755]
tree-walk.c