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

Re: [PATCH] fmt-merge-msg: avoid leaking strbuf in shortlog()

From
René Scharfe <l.s.r@web.de>
Date
Dec 19, 2017, 18:26 UTC
Message-ID
<f79ae9a3-de47-c41e-fea6-6a0fedf4ef63@web.de>
In-Reply-To
<20171219113855.GA24558@sigill.intra.peff.net>
Am 19.12.2017 um 12:38 schrieb Jeff King:
Show 21 quoted lines
> On Mon, Dec 18, 2017 at 08:18:17PM +0100, René Scharfe wrote:
> 
>>> I'd actually argue the other way: the simplest interface is one where
>>> the string list owns all of its pointers. That keeps the
>>> ownership/lifetime issues clear, and it's one less step for the caller
>>> to have to remember to do at the end (they do have to clear() the list,
>>> but they must do that anyway to free the array of items).
>>>
>>> It does mean that some callers may have to remember to free a temporary
>>> buffer right after adding its contents to the list. But that's a lesser
>>> evil, I think, since the memory ownership issues are all clearly
>>> resolved at the time of add.
>>>
>>> The big cost is just extra copies/allocations.
>>
>> An interface requiring callers to allocate can be used to implement a
>> wrapper that does all allocations for them -- the other way around is
>> harder.  It can be used to avoid object duplication, but duplicates
>> functions.  No idea if that's worth it.
> 
> Sure, but would anybody actually want to _use_ the non-wrapped version?

Not sure, but cases that currently use STRING_LIST_INIT_NODUP probably apply. Apropos: apply.c::write_out_results() looks like it might, too.

Another question is how much it would cost to let them duplicate strings as well in order to simplify the code.

> That's the same duality we have now with string_list.
Hmm, I thought we *were* discussing string_list?
Show 23 quoted lines
>>> Having a "format into a string" wrapper doesn't cover _every_ string you
>>> might want to add to a list, but my experience with argv_array_pushf
>>> leads me to believe that it covers quite a lot of cases.
>>
>> It would fit in with the rest of the API -- we have string_list_append()
>> as a wrapper for string_list_append_nodup()+xstrdup() already.  We also
>> have similar functions for strbuf and argv_array.  I find it a bit sad
>> to reimplement xstrfmt() yet again instead of using it directly, though.
> 
> I dunno, I think could provide some safety and some clarity. IOW, why
> _don't_ we like:
> 
>    string_list_append_nodup(list, xstrfmt(fmt, ...));
> 
> ? I think because:
> 
>    1. It's a bit long and ugly.
> 
>    2. It requires a magic "nodup", because we're violating the memory
>       ownership boundary.
> 
>    3. It doesn't provide any safety for the case where strdup_strings is
>       not set, making it easy to leak accidentally.

Right, and at least 2 and 3 would be solved by having distinct types for the plain and the duplicating variants. The plain one would always "nodup" and would have no flags that need to be checked.

Show 8 quoted lines
> Doing:
> 
>    string_list_appendf(list, fmt, ...);
> 
> pushes the memory ownership semantics "under the hood" of the
> string_list API. And as opposed to being a simple wrapper, it could
> assert that strdup_strings is set (we already do some similar assertions
> in the split functions).
Yes, that check would guard against leaks.

Having few functions that can be combined looks like a cleaner interface to me than having additional shortcuts for specific combinations -- less duplication, smaller surface.

That said I'm not against adding string_list_appendf(); we already have similar functions for other types.

René
Previous: Jeff KingNext: Jeff King
Message 14 of 16 in “fmt-merge-msg: avoid leaking strbuf in shortlog()”
  1. fmt-merge-msg: avoid leaking strbuf in shortlog()René Scharfe, Dec 7, 2017
  2. Jeff KingDec 7, 2017
  3. René ScharfeDec 8, 2017
  4. Junio C HamanoDec 8, 2017
  5. René ScharfeDec 8, 2017
  6. Jeff KingDec 8, 2017
  7. Junio C HamanoDec 7, 2017
  8. Jeff KingDec 8, 2017
  9. René ScharfeDec 8, 2017
  10. Junio C HamanoDec 8, 2017
  11. Jeff KingDec 8, 2017
  12. René ScharfeDec 18, 2017
  13. Jeff KingDec 19, 2017
  14. René ScharfeDec 19, 2017
  15. Jeff KingDec 20, 2017
  16. Jeff KingDec 8, 2017

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.