The test I sent earlier in [1] fails the linux-leaks CI job, not because it introduces new leaks, but just because it runs existing leaks in a test marked as passing-leaks. Of course we can drop the passing flag, but I figured it would probably be an easy fix. Famous last words. It turned into quite a rabbit hole of actual leaks (albeit small and bounded per process) and some questionable memory ownership semantics. Here's the series I came up with. I'm cc-ing Stolee as the last person unfortunate enough to have touched this area. :) [1/5]: list_objects_filter_copy(): deep-copy sparse_oid_name field [2/5]: transport: deep-copy object-filter struct for fetch-pack [3/5]: transport: free filter options in disconnect_git() [4/5]: list_objects_filter_options: plug leak of filter_spec strings [5/5]: prepare_repo_settings(): plug leak of config values list-objects-filter-options.c | 20 ++++++++++++++------ repo-settings.c | 7 +++---- transport.c | 5 ++++- 3 files changed, 21 insertions(+), 11 deletions(-) -Peff [1] https://lore.kernel.org/git/YxkG3A30vNfu55Sx@xxxxxxxxxxxxxxxxxxxxxxx/