From: Junio C Hamano <gitster@pobox.com>
To: Patrick Steinhardt <ps@pks.im>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] clean: do not pass strbuf by value
Date: Wed, 30 Jul 2025 07:15:28 -0700 [thread overview]
Message-ID: <xmqq8qk5ojcv.fsf@gitster.g> (raw)
In-Reply-To: <aImv4kZJS4CUqmZ3@pks.im> (Patrick Steinhardt's message of "Wed, 30 Jul 2025 07:38:42 +0200")
Patrick Steinhardt <ps@pks.im> writes:
> On Tue, Jul 29, 2025 at 02:03:27PM -0700, Junio C Hamano wrote:
>> When you pass a structure by value, the callee can modify the
>> contents of the structure that was passed in without having to worry
>> about changing the structure the caller has. Passing structure by
>
> s/structure/structures/
>
>> value sometimes (but not very often) can be a valid way to give
>> callee a temporary variable it can freely modify.
>>
>> But not a structure with members that are pointers, like a strbuf.
>>
>> builtin/clean.c:list_and_choose() reads a line interactively from
>> the user, and passes the line (in a strbuf) to parse_choice() by
>> value, which then munges by replacing ',' with ' ' (to accept both
>> comma and space separated list of choices). But because the strbuf
>> passed by value still shares the underlying character array buf[],
>> this ends up munging the caller's strbuf contents.
>>
>> This is a catastrophe waiting to happen. If the callee causes the
>> strbuf to be reallocated, the buf[] the caller has will become
>> dangling, and when the caller does strbuf_release(), it would result
>> in double-free.
>>
>> Stop calling the function with misleading call-by-value with strbuf.
>
> I think the second "with" should be dropped?
>
>>
>> Signed-off-by: Junio C Hamano <gitster@pobox.com>
>> ---
>> builtin/clean.c | 10 +++++-----
>> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> Good finding with an obvious fix. Thanks!
>
> Patrick
"Fix" is a word that is bit stronger than what is actually
happening, as the code is not yet broken ;-)
I notice that there are a few structures passed by value in reftable
(e.g. merged_iter_pqueue in pq.h and string_view in record.h), but I
only looked at the output of
$ git grep '[(,]struct [a-z_]* [^*]*[,)]' \*.h
and do not know if they are something to worry about.
Thanks.
next prev parent reply other threads:[~2025-07-30 14:15 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-29 21:03 [PATCH] clean: do not pass strbuf by value Junio C Hamano
2025-07-30 5:38 ` Patrick Steinhardt
2025-07-30 14:15 ` Junio C Hamano [this message]
2025-07-31 5:31 ` Patrick Steinhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqq8qk5ojcv.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.