From: Junio C Hamano <gitster@pobox.com>
To: Jeff King <peff@peff.net>
Cc: Mathew George <mathewegeorge@gmail.com>, git@vger.kernel.org
Subject: Re: [PATCH 03/11] remote: transfer ownership of memory in add_url(), etc
Date: Fri, 14 Jun 2024 10:04:50 -0700 [thread overview]
Message-ID: <xmqq1q4zh2vh.fsf@gitster.g> (raw)
In-Reply-To: <20240614102722.GC222445@coredump.intra.peff.net> (Jeff King's message of "Fri, 14 Jun 2024 06:27:22 -0400")
Jeff King <peff@peff.net> writes:
> diff --git a/remote.c b/remote.c
> index fd9d58f820..f7c846865f 100644
> --- a/remote.c
> +++ b/remote.c
> @@ -64,13 +64,13 @@ static char *alias_url(const char *url, struct rewrites *r)
> static void add_url(struct remote *remote, const char *url)
> {
> ALLOC_GROW(remote->url, remote->url_nr + 1, remote->url_alloc);
> - remote->url[remote->url_nr++] = url;
> + remote->url[remote->url_nr++] = xstrdup(url);
> }
>
> static void add_pushurl(struct remote *remote, const char *pushurl)
> {
> ALLOC_GROW(remote->pushurl, remote->pushurl_nr + 1, remote->pushurl_alloc);
> - remote->pushurl[remote->pushurl_nr++] = pushurl;
> + remote->pushurl[remote->pushurl_nr++] = xstrdup(pushurl);
> }
OK. This makes it easier to reason about why these elements are
freed in remote_clear().
> static void add_pushurl_alias(struct remote_state *remote_state,
> @@ -79,6 +79,7 @@ static void add_pushurl_alias(struct remote_state *remote_state,
> char *alias = alias_url(url, &remote_state->rewrites_push);
> if (alias)
> add_pushurl(remote, alias);
> + free(alias);
> }
OK. I wondered if we want to strdup(url) in my review on the
previous step, but now we are making the add_url() responsible
for making a copy, we instead do the opposite, i.e. free alias
that was allocated for us because we no longer need it.
> static void add_url_alias(struct remote_state *remote_state,
> @@ -87,6 +88,7 @@ static void add_url_alias(struct remote_state *remote_state,
> char *alias = alias_url(url, &remote_state->rewrites);
> add_url(remote, alias ? alias : url);
> add_pushurl_alias(remote_state, remote, url);
> + free(alias);
> }
Likewise.
> @@ -336,7 +338,7 @@ static void read_branches_file(struct remote_state *remote_state,
> else
> frag = to_free = repo_default_branch_name(the_repository, 0);
>
> - add_url_alias(remote_state, remote, strbuf_detach(&buf, NULL));
> + add_url_alias(remote_state, remote, buf.buf);
It is curious that you delay ...
> @@ -347,6 +349,7 @@ static void read_branches_file(struct remote_state *remote_state,
> refspec_appendf(&remote->push, "HEAD:refs/heads/%s", frag);
> remote->fetch_tags = 1; /* always auto-follow */
>
> + strbuf_release(&buf);
> free(to_free);
> }
... strbuf_release() of the buf to the very end of the function.
In the original, buf became invalid by doing strbuf_detach(), so we
could do strbuf_release() immediately after add_url_alias() returns
to us if we wanted to.
> @@ -431,15 +434,13 @@ static int handle_config(const char *key, const char *value,
> else if (!strcmp(subkey, "prunetags"))
> remote->prune_tags = git_config_bool(key, value);
> else if (!strcmp(subkey, "url")) {
> - char *v;
> - if (git_config_string(&v, key, value))
> - return -1;
> - add_url(remote, v);
> + if (!value)
> + return config_error_nonbool(key);
> + add_url(remote, value);
OK. config_string() does (1) check for "I exist hence I am true"
boolean, and (2) give us a duplicate of the value. We do not want
the latter, so we do the former ourselves here. The same story
repeats for pushurl below (ellided).
> @@ -495,8 +496,10 @@ static void alias_all_urls(struct remote_state *remote_state)
> for (j = 0; j < remote_state->remotes[i]->pushurl_nr; j++) {
> char *alias = alias_url(remote_state->remotes[i]->pushurl[j],
> &remote_state->rewrites);
> - if (alias)
> + if (alias) {
> + free((char *)remote_state->remotes[i]->pushurl[j]);
> remote_state->remotes[i]->pushurl[j] = alias;
> + }
> }
OK, this is the replacement codepath we saw earlier. Makes sense
for this and the .url[] side on the other hunk (it is curious that
this has .pushurl[] before .url[], which is the opposite order of
how everybody else deals with them, as pushurl came later).
Thanks.
next prev parent reply other threads:[~2024-06-14 17:04 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-09 6:51 Cannot override `remote.origin.url` with `-c` option Mathew George
2024-06-11 7:51 ` Jeff King
2024-06-11 15:28 ` Junio C Hamano
2024-06-13 10:24 ` Jeff King
2024-06-14 10:24 ` [PATCH 0/11] allow overriding remote.*.url Jeff King
2024-06-14 10:25 ` [PATCH 01/11] archive: fix check for missing url Jeff King
2024-06-14 10:26 ` [PATCH 02/11] remote: refactor alias_url() memory ownership Jeff King
2024-06-14 17:05 ` Junio C Hamano
2024-06-14 10:27 ` [PATCH 03/11] remote: transfer ownership of memory in add_url(), etc Jeff King
2024-06-14 17:04 ` Junio C Hamano [this message]
2024-06-16 4:59 ` Jeff King
2024-06-17 17:42 ` Junio C Hamano
2024-06-25 17:30 ` Elijah Newren
2024-06-14 10:28 ` [PATCH 04/11] remote: use strvecs to store remote url/pushurl Jeff King
2024-06-25 17:32 ` Elijah Newren
2024-06-14 10:29 ` [PATCH 05/11] remote: simplify url/pushurl selection Jeff King
2024-06-25 17:33 ` Elijah Newren
2024-06-14 10:30 ` [PATCH 06/11] config: document remote.*.url/pushurl interaction Jeff King
2024-06-25 17:34 ` Elijah Newren
2024-06-14 10:31 ` [PATCH 07/11] remote: allow resetting url list Jeff King
2024-06-25 17:35 ` Elijah Newren
2024-06-14 10:31 ` [PATCH 08/11] t5801: make remote-testgit GIT_DIR setup more robust Jeff King
2024-06-25 17:36 ` Elijah Newren
2024-06-14 10:34 ` [PATCH 09/11] t5801: test remote.*.vcs config Jeff King
2024-06-14 10:37 ` [PATCH 10/11] remote: always require at least one url in a remote Jeff King
2024-06-14 10:42 ` [PATCH 11/11] remote: drop checks for zero-url case Jeff King
2024-06-25 17:37 ` Elijah Newren
2024-06-25 17:44 ` [PATCH 0/11] allow overriding remote.*.url Elijah Newren
2024-06-26 20:40 ` Jeff King
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=xmqq1q4zh2vh.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=mathewegeorge@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 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.