Junio C Hamano <gitster@xxxxxxxxx> writes: > It seems that the result of calling init_revisions() from backfill > is leaked? > > https://github.com/git/git/actions/runs/12218430154/job/34083929479 > > I did not dig further but the below is from my local leaksanitizer > run. The attached patch seems to plug the leaks observed by your backfill tests. If you agree with the implementation of the change, you are welcome to squash it in. I may be missing a better mechanism in the path-walk API that I could use to plug the leaks, in which case, of course a fix using such a better mechanism is very much welcomed. A few things I noticed about path-walk API during my poking are: - struct path_walk_info has PATH_WALK_INFO_INIT() macro, but not a matching path_walk_info_init() helper function to help initialize any heap-allocated instances. In general, anything that requires _INIT() macro by definition wants to be initialized with more than nul-initialized (otherwise, it would be fine to leave it uninitialized in the BSS, clear with = {0} initialization on the stack), so lack of matching path_walk_info_init() raises an eyebrow. - struct path_walk_info seems to lack a destructor. In general, anything complex enough to require initializer should have one. - lack of destructor for path_walk_info requires users to release resources held by "struct pattern_list" instance at pwi.pl; if we had a destructor, we wouldn't have 2 of the three leaks we had to fix here. Thanks. diff --git c/builtin/backfill.c w/builtin/backfill.c index 225764f17e..1cf2df9303 100644 --- c/builtin/backfill.c +++ w/builtin/backfill.c @@ -92,8 +92,11 @@ static int do_backfill(struct backfill_context *ctx) if (ctx->sparse) { CALLOC_ARRAY(info.pl, 1); - if (get_sparse_checkout_patterns(info.pl)) + if (get_sparse_checkout_patterns(info.pl)) { + clear_pattern_list(info.pl); + free(info.pl); return error(_("problem loading sparse-checkout")); + } } repo_init_revisions(ctx->repo, &revs, ""); @@ -113,6 +116,11 @@ static int do_backfill(struct backfill_context *ctx) download_batch(ctx); clear_backfill_context(ctx); + release_revisions(&revs); + if (info.pl) { + clear_pattern_list(info.pl); + free(info.pl); + } return ret; }