diff options
author | Shawn O. Pearce <spearce@spearce.org> | 2007-03-05 12:43:14 -0500 |
---|---|---|
committer | Shawn O. Pearce <spearce@spearce.org> | 2007-03-05 12:43:14 -0500 |
commit | 2f6dc35d2ad0bd2a8648902a692f087f47d1ee86 (patch) | |
tree | e9b268b86e2e7418a849702f9cd361a06ab69033 | |
parent | 734c91f9e292cf6ed1401c178bc9fbb902cc82dd (diff) | |
download | git-2f6dc35d2ad0bd2a8648902a692f087f47d1ee86.tar.gz git-2f6dc35d2ad0bd2a8648902a692f087f47d1ee86.tar.xz |
fast-import: Fail if a non-existant commit is used for merge
Johannes Sixt noticed during one of his own imports that fast-import
did not fail if a non-existant commit is referenced by SHA-1 value
as an argument to the 'merge' command. This allowed the user to
unknowingly create commits that would fail in fsck, as the commit
contents would not be completely reachable.
A side effect of this bug was that a frontend process could mark
any SHA-1 object (blob, tree, tag) as a parent of a merge commit.
This should also fail in fsck, as the commit is not a valid commit.
We now use the same rule as the 'from' command. If a commit is
referenced in the 'merge' command by hex formatted SHA-1 then the
SHA-1 must be a commit or a tag that can be peeled back to a commit,
the commit must already exist, and must be readable by the core Git
infrastructure code. This requirement means that the commit must
have existed prior to fast-import starting, or the commit must have
been flushed out by a prior 'checkpoint' command.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
-rw-r--r-- | fast-import.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fast-import.c b/fast-import.c index 490f64003..d9492b988 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1752,7 +1752,14 @@ static struct hash_list *cmd_merge(unsigned int *count) if (oe->type != OBJ_COMMIT) die("Mark :%" PRIuMAX " not a commit", idnum); hashcpy(n->sha1, oe->sha1); - } else if (get_sha1(from, n->sha1)) + } else if (!get_sha1(from, n->sha1)) { + unsigned long size; + char *buf = read_object_with_reference(n->sha1, + type_names[OBJ_COMMIT], &size, n->sha1); + if (!buf || size < 46) + die("Not a valid commit: %s", from); + free(buf); + } else die("Invalid ref name or SHA1 expression: %s", from); n->next = NULL; |