aboutsummaryrefslogtreecommitdiffstats
path: root/list-objects.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2023-09-14 11:16:59 -0700
committerJunio C Hamano <gitster@pobox.com>2023-09-14 11:16:59 -0700
commit174dfe463778680382d32a280ad73bc12e2017d3 (patch)
treead21d985a01f21c35fd13fbe5702b1c9f0c77ca5 /list-objects.c
parentMerge branch 'ks/ref-filter-sort-numerically' (diff)
parentlower core.maxTreeDepth default to 2048 (diff)
downloadgit-174dfe463778680382d32a280ad73bc12e2017d3.tar.gz
git-174dfe463778680382d32a280ad73bc12e2017d3.zip
Merge branch 'jk/tree-name-and-depth-limit'
We now limit depth of the tree objects and maximum length of pathnames recorded in tree objects. * jk/tree-name-and-depth-limit: lower core.maxTreeDepth default to 2048 tree-diff: respect max_allowed_tree_depth list-objects: respect max_allowed_tree_depth read_tree(): respect max_allowed_tree_depth traverse_trees(): respect max_allowed_tree_depth add core.maxTreeDepth config fsck: detect very large tree pathnames tree-walk: rename "error" variable tree-walk: drop MAX_TRAVERSE_TREES macro tree-walk: reduce stack size for recursive functions
Diffstat (limited to 'list-objects.c')
-rw-r--r--list-objects.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/list-objects.c b/list-objects.c
index e60a6cd5b4..c25c72b32c 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -14,6 +14,7 @@
#include "packfile.h"
#include "object-store-ll.h"
#include "trace.h"
+#include "environment.h"
struct traversal_context {
struct rev_info *revs;
@@ -21,6 +22,7 @@ struct traversal_context {
show_commit_fn show_commit;
void *show_data;
struct filter *filter;
+ int depth;
};
static void show_commit(struct traversal_context *ctx,
@@ -118,7 +120,9 @@ static void process_tree_contents(struct traversal_context *ctx,
entry.path, oid_to_hex(&tree->object.oid));
}
t->object.flags |= NOT_USER_GIVEN;
+ ctx->depth++;
process_tree(ctx, t, base, entry.path);
+ ctx->depth--;
}
else if (S_ISGITLINK(entry.mode))
; /* ignore gitlink */
@@ -156,6 +160,9 @@ static void process_tree(struct traversal_context *ctx,
!revs->include_check_obj(&tree->object, revs->include_check_data))
return;
+ if (ctx->depth > max_allowed_tree_depth)
+ die("exceeded maximum allowed tree depth");
+
failed_parse = parse_tree_gently(tree, 1);
if (failed_parse) {
if (revs->ignore_missing_links)
@@ -349,6 +356,7 @@ static void traverse_non_commits(struct traversal_context *ctx,
if (!path)
path = "";
if (obj->type == OBJ_TREE) {
+ ctx->depth = 0;
process_tree(ctx, (struct tree *)obj, base, path);
continue;
}