Thread (8 messages) flat view 8 messages, 3 authors, 2021-08-31

Re: [PATCH v2] pull, fetch: fix segfault in --set-upstream option

From: Ævar Arnfjörð Bjarmason <hidden>
Date: 2021-08-24 08:51:40
Subsystem: the rest · Maintainer: Linus Torvalds

On Tue, Aug 24 2021, Clemens Fruhwirth wrote:
On Mon, 23 Aug 2021 at 14:56, Ævar Arnfjörð Bjarmason [off-list ref] wrote:
quoted
A proposed replacement of cf/fetch-set-upstream-while-detached which
as noted in What's Cooking has been languishing for a while. I changed
the die() in my version to a warning() as suggested by Junio & updated
the test and commit message accordingly.
Thank you Ævar, for taking care of that and adding tests and my
apologizes for not responding in a timely manner.
No worries.
quoted
 builtin/fetch.c         | 11 +++++++++++
 t/t5553-set-upstream.sh | 22 ++++++++++++++++++++++
 2 files changed, 33 insertions(+)
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 25740c13df1..ca487edd805 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1623,6 +1623,17 @@ static int do_fetch(struct transport *transport,
                        }
                }
                if (source_ref) {
+                       if (!branch) {
+                               const char *shortname = NULL;
+                               if (!skip_prefix(source_ref->name,
+                                                "refs/heads/", &shortname))
+                                       shortname = source_ref->name;
Is skip_prefix ever able to fail?

- If yes, then shortname will be left pointing to NULL when we print
the warning below. Warning probably won't die because of NULL, but it
still will print something weird.
If it fails we'll use source_ref->name, so it won't be NULL...
- If no, then an assert(!skip_prefix(source_ref->name, "refs/heads/",
&shortname)) might be more idiomatic.
Which means that this would be a bug, since it's not handling the case
where the source doesn't start with refs/heads/*.

I.e. it's the same as doing it this way (on top of this v2), which
perhaps is a clearer way to express the same idea. What do you think?
diff --git a/builtin/fetch.c b/builtin/fetch.c
index ca487edd805..2bc9159690d 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1624,10 +1624,9 @@ static int do_fetch(struct transport *transport,
 		}
 		if (source_ref) {
 			if (!branch) {
-				const char *shortname = NULL;
-				if (!skip_prefix(source_ref->name,
-						 "refs/heads/", &shortname))
-					shortname = source_ref->name;
+				const char *shortname = source_ref->name;
+				skip_prefix(shortname, "refs/heads/", &shortname);
+
 				warning(_("could not set upstream of HEAD to '%s' from '%s' when "
 					  "it does not point to any branch."),
 					shortname, transport->remote->name);
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help