Git development
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Jeff King <peff@peff.net>
Cc: Nicolas Le Cam <niko.lecam@gmail.com>,  git@vger.kernel.org
Subject: Re: [PATCH 2/1] revision: simplify mark_argv_for_free() callers
Date: Tue, 01 Sep 2026 11:02:27 -0700	[thread overview]
Message-ID: <xmqq8q5ksvd8.fsf@gitster.g> (raw)
In-Reply-To: <20260901063645.GA2951423@coredump.intra.peff.net> (Jeff King's message of "Tue, 1 Sep 2026 02:36:45 -0400")

Jeff King <peff@peff.net> writes:

> BTW, this is a small cleanup that I resisted putting into the earlier
> commit in order to keep it focused. But maybe worth doing on top?

I like it.  It is a tiny simplification but makes the callers easier
to read.

>
> -- >8 --
> Subject: revision: simplify mark_argv_for_free() callers
>
> You do not want to mark an argv element for freeing unless the caller
> has given us the free_removed_argv_elements flag. Originally we just
> called free() in this case, so each caller checked the flag itself. Now
> that we mark them via a helper function, we can push the check down into
> the helper. This saves a little bit of duplicated code, but also
> hopefully makes the result conceptually simpler.
>
> Every caller but one was already checking this flag. The exception is
> setup_revisions_from_strvec(), but it always sets the flag explicitly
> (since its whole purpose is managing argv memory). So even though it was
> not checking the flag, doing so is OK (it will always be set).
>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
>  revision.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/revision.c b/revision.c
> index 7aee96bd8e..59d6372506 100644
> --- a/revision.c
> +++ b/revision.c
> @@ -2317,8 +2317,11 @@ static timestamp_t parse_age(const char *arg)
>   * usual const argv array, even when opt->free_removed_argv_elements is set).
>   * We cast away the const on their behalf.
>   */
> -static void mark_argv_for_free(struct rev_info *revs, const char *str)
> +static void mark_argv_for_free(const struct setup_revision_opt *opt,
> +			       struct rev_info *revs, const char *str)
>  {
> +	if (!opt || !opt->free_removed_argv_elements)
> +		return;
>  	if (!str)
>  		return;
>  	strvec_push_nodup(&revs->argv_to_free, (char *)str);
> @@ -2335,8 +2338,7 @@ static void overwrite_argv(int *argc, const char **argv,
>  	 * cases around the free() and NULL operations.
>  	 */
>  	if (*value != argv[*argc]) {
> -		if (opt && opt->free_removed_argv_elements)
> -			mark_argv_for_free(revs, argv[*argc]);
> +		mark_argv_for_free(opt, revs, argv[*argc]);
>  		argv[*argc] = *value;
>  		*value = NULL;
>  	}
> @@ -3055,8 +3057,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
>  			const char *arg = argv[i];
>  			if (strcmp(arg, "--"))
>  				continue;
> -			if (opt && opt->free_removed_argv_elements)
> -				mark_argv_for_free(revs, argv[i]);
> +			mark_argv_for_free(opt, revs, argv[i]);
>  			argv[i] = NULL;
>  			argc = i;
>  			if (argv[i + 1])
> @@ -3260,8 +3261,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
>  	}
>  
>  	if (argv) {
> -		if (opt && opt->free_removed_argv_elements)
> -			mark_argv_for_free(revs, argv[left]);
> +		mark_argv_for_free(opt, revs, argv[left]);
>  		argv[left] = NULL;
>  	}
>  
> @@ -3283,7 +3283,7 @@ void setup_revisions_from_strvec(struct strvec *argv, struct rev_info *revs,
>  	ret = setup_revisions(argv->nr, argv->v, revs, opt);
>  
>  	for (size_t i = ret; i < argv->nr; i++)
> -		mark_argv_for_free(revs, argv->v[i]);
> +		mark_argv_for_free(opt, revs, argv->v[i]);
>  	argv->nr = ret;
>  }

  reply	other threads:[~2026-09-01 18:02 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-30 21:55 [BUG] git stash show --src-prefix prints freed memory since 2.52.0 Nicolas Le Cam
2026-09-01  6:28 ` [PATCH] revision: hang on to "freed" argv elements Jeff King
2026-09-01  6:36   ` [PATCH 2/1] revision: simplify mark_argv_for_free() callers Jeff King
2026-09-01 18:02     ` Junio C Hamano [this message]
2026-09-01  8:51   ` [PATCH] revision: hang on to "freed" argv elements Patrick Steinhardt
2026-09-01  9:21     ` Jeff King
2026-09-01 11:08       ` 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=xmqq8q5ksvd8.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=niko.lecam@gmail.com \
    --cc=peff@peff.net \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox