зеркало из https://github.com/microsoft/git.git
Merge branch 'jk/maint-1.6.2-upload-archive' into jk/maint-upload-archive
* jk/maint-1.6.2-upload-archive: archive: don't let remote clients get unreachable commits Conflicts: archive.c archive.h builtin-archive.c builtin/upload-archive.c t/t5000-tar-tree.sh
This commit is contained in:
Коммит
7b51c33b37
18
archive.c
18
archive.c
|
@ -247,7 +247,8 @@ static void parse_pathspec_arg(const char **pathspec,
|
|||
}
|
||||
|
||||
static void parse_treeish_arg(const char **argv,
|
||||
struct archiver_args *ar_args, const char *prefix)
|
||||
struct archiver_args *ar_args, const char *prefix,
|
||||
int remote)
|
||||
{
|
||||
const char *name = argv[0];
|
||||
const unsigned char *commit_sha1;
|
||||
|
@ -256,8 +257,17 @@ static void parse_treeish_arg(const char **argv,
|
|||
const struct commit *commit;
|
||||
unsigned char sha1[20];
|
||||
|
||||
if (get_sha1(name, sha1))
|
||||
die("Not a valid object name");
|
||||
/* Remotes are only allowed to fetch actual refs */
|
||||
if (remote) {
|
||||
char *ref = NULL;
|
||||
if (!dwim_ref(name, strlen(name), sha1, &ref))
|
||||
die("no such ref: %s", name);
|
||||
free(ref);
|
||||
}
|
||||
else {
|
||||
if (get_sha1(name, sha1))
|
||||
die("Not a valid object name");
|
||||
}
|
||||
|
||||
commit = lookup_commit_reference_gently(sha1, 1);
|
||||
if (commit) {
|
||||
|
@ -414,7 +424,7 @@ int write_archive(int argc, const char **argv, const char *prefix,
|
|||
setup_git_directory();
|
||||
}
|
||||
|
||||
parse_treeish_arg(argv, &args, prefix);
|
||||
parse_treeish_arg(argv, &args, prefix, remote);
|
||||
parse_pathspec_arg(argv + 1, &args);
|
||||
|
||||
return ar->write_archive(ar, &args);
|
||||
|
|
|
@ -242,6 +242,14 @@ test_expect_success \
|
|||
'git archive --list outside of a git repo' \
|
||||
'GIT_DIR=some/non-existing/directory git archive --list'
|
||||
|
||||
test_expect_success 'clients cannot access unreachable commits' '
|
||||
test_commit unreachable &&
|
||||
sha1=`git rev-parse HEAD` &&
|
||||
git reset --hard HEAD^ &&
|
||||
git archive $sha1 >remote.tar &&
|
||||
test_must_fail git archive --remote=. $sha1 >remote.tar
|
||||
'
|
||||
|
||||
test_expect_success 'git-archive --prefix=olde-' '
|
||||
git archive --prefix=olde- >h.tar HEAD &&
|
||||
(
|
||||
|
|
Загрузка…
Ссылка в новой задаче