Re: [PATCH] remote.c: Fix overtight refspec validation
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:44:25
Junio C Hamano [off-list ref] writes:
Especially that "refs/tags/*" is sad in that it is leaking an internal implementation detail. I do not think the original code ever used wildcards on the push side, and it probably was a good idea to allow wildcards when the code was rewritten.
Having thought about this a bit more, I think this patch would be more
useful. Please discard the previous patch to builtin-push.c and replace
with this patch.
Now it allows you to say:
[remote "neigh"]
url = ../neighbour
push = refs/tags/*
to propagate all tags one-to-one, without having to say
"refs/tags/*:refs/tags/*".
This however has unintended side effect of allowing
[remote "bour"]
url = ../neighbour
fetch = refs/heads/*
at the syntax level. I do not know offhand the fetch backends are
prepared to deal with such wildcard patterns.
Daniel?
---
remote.c | 18 +++++++++++-------
1 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/remote.c b/remote.c
index 40ed246..c39d831 100644
--- a/remote.c
+++ b/remote.c@@ -417,17 +417,21 @@ static struct refspec *parse_refspec_internal(int nr_refspec, const char **refsp rhs++; rlen = strlen(rhs); is_glob = (2 <= rlen && !strcmp(rhs + rlen - 2, "/*")); - rs[i].dst = xstrndup(rhs, rlen - is_glob * 2); + if (is_glob) + rlen -= 2; + rs[i].dst = xstrndup(rhs, rlen); } llen = (rhs ? (rhs - lhs - 1) : strlen(lhs)); - if (is_glob != (2 <= llen && !memcmp(lhs + llen - 2, "/*", 2))) - goto invalid; - - if (is_glob) { + if (2 <= llen && !memcmp(lhs + llen - 2, "/*", 2)) { + if (rhs && !is_glob) + goto invalid; + is_glob = 1; llen -= 2; - rlen -= 2; + } else if (rhs && is_glob) { + goto invalid; } + rs[i].pattern = is_glob; rs[i].src = xstrndup(lhs, llen);
@@ -446,7 +450,7 @@ static struct refspec *parse_refspec_internal(int nr_refspec, const char **refsp } /* * RHS - * - missing is allowed. + * - missing is ok, and is same as empty. * - empty is ok; it means not to store. * - otherwise it must be a valid looking ref. */