git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 1/5] list_objects_filter_copy(): deep-copy sparse_oid_name field

From
Jeff King <peff@peff.net>
Date
Sep 8, 2022, 04:54 UTC
Message-ID
<Yxl1hcX97W4wpWNj@coredump.intra.peff.net>
In-Reply-To
<Yxl1BNQoy6Drf0Oe@coredump.intra.peff.net>

The purpose of our copy function is to do a deep copy of each field so that the source and destination structs become independent. We correctly copy the filter_spec string list, but we forgot the sparse_oid_name field. By doing a shallow copy of the pointer, that puts us at risk for a use-after-free if one or both of the structs is cleaned up.

I don't think this can be triggered in practice, because we tend to leak the structs rather than actually clean them up. But this should future-proof us for plugging those leaks.

Signed-off-by: Jeff King <peff@peff.net>
---
I think this is the only thing missing. You can correlate with the
_release() function to see what other things might need a deep copy, and
everything else seems covered.
 list-objects-filter-options.c | 1 +
 1 file changed, 1 insertion(+)
diff --git a/list-objects-filter-options.c b/list-objects-filter-options.c
index 4b25287886..41c41c9d45 100644
--- a/list-objects-filter-options.c
+++ b/list-objects-filter-options.c
@@ -418,6 +418,7 @@ void list_objects_filter_copy(
 	string_list_init_dup(&dest->filter_spec);
 	for_each_string_list_item(item, &src->filter_spec)
 		string_list_append(&dest->filter_spec, item->string);
+	dest->sparse_oid_name = xstrdup_or_null(src->sparse_oid_name);
 
 	ALLOC_ARRAY(dest->sub, dest->sub_alloc);
 	for (i = 0; i < src->sub_nr; i++)
-- 
2.37.3.1139.g47294c03c7
Previous: Jeff KingNext: Jeff King
Message 2 of 8 in “plugging some list-objects-filter leaks”
  1. 0/5 plugging some list-objects-filter leaksJeff King, Sep 8, 2022
  2. 1/5 list_objects_filter_copy(): deep-copy sparse_oid_name fieldJeff King, Sep 8, 2022
  3. 2/5 transport: deep-copy object-filter struct for fetch-packJeff King, Sep 8, 2022
  4. 3/5 transport: free filter options in disconnect_git()Jeff King, Sep 8, 2022
  5. 4/5 list_objects_filter_options: plug leak of filter_spec stringsJeff King, Sep 8, 2022
  6. 5/5 prepare_repo_settings(): plug leak of config valuesJeff King, Sep 8, 2022
  7. Derrick StoleeSep 9, 2022
  8. Jeff KingSep 11, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.