send-pack: tighten checks for remote names
"git push $URL HEAD~6" created a bogus ref HEAD~6 immediately under $GIT_DIR of the remote repository. While we should keep refspecs that have arbitrary extended SHA-1 expression on the source side working (e.g. "HEAD~6:refs/tags/yesterday"), we should not create bogus ref on the other end. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
411fb8baa6
commit
37adac765a
2
refs.c
2
refs.c
@ -534,7 +534,7 @@ int check_ref_format(const char *ref)
|
|||||||
level++;
|
level++;
|
||||||
if (!ch) {
|
if (!ch) {
|
||||||
if (level < 2)
|
if (level < 2)
|
||||||
return -1; /* at least of form "heads/blah" */
|
return -2; /* at least of form "heads/blah" */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
21
send-pack.c
21
send-pack.c
@ -406,6 +406,25 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void verify_remote_names(int nr_heads, char **heads)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < nr_heads; i++) {
|
||||||
|
const char *remote = strchr(heads[i], ':');
|
||||||
|
|
||||||
|
remote = remote ? (remote + 1) : heads[i];
|
||||||
|
switch (check_ref_format(remote)) {
|
||||||
|
case 0: /* ok */
|
||||||
|
case -2: /* ok but a single level -- that is fine for
|
||||||
|
* a match pattern.
|
||||||
|
*/
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
die("remote part of refspec is not a valid name in %s",
|
||||||
|
heads[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -457,6 +476,8 @@ int main(int argc, char **argv)
|
|||||||
usage(send_pack_usage);
|
usage(send_pack_usage);
|
||||||
if (heads && send_all)
|
if (heads && send_all)
|
||||||
usage(send_pack_usage);
|
usage(send_pack_usage);
|
||||||
|
verify_remote_names(nr_heads, heads);
|
||||||
|
|
||||||
pid = git_connect(fd, dest, exec);
|
pid = git_connect(fd, dest, exec);
|
||||||
if (pid < 0)
|
if (pid < 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user