Skip to content

Commit 2f6dc35

Browse files
committed
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>
1 parent 734c91f commit 2f6dc35

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

fast-import.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1752,7 +1752,14 @@ static struct hash_list *cmd_merge(unsigned int *count)
17521752
if (oe->type != OBJ_COMMIT)
17531753
die("Mark :%" PRIuMAX " not a commit", idnum);
17541754
hashcpy(n->sha1, oe->sha1);
1755-
} else if (get_sha1(from, n->sha1))
1755+
} else if (!get_sha1(from, n->sha1)) {
1756+
unsigned long size;
1757+
char *buf = read_object_with_reference(n->sha1,
1758+
type_names[OBJ_COMMIT], &size, n->sha1);
1759+
if (!buf || size < 46)
1760+
die("Not a valid commit: %s", from);
1761+
free(buf);
1762+
} else
17561763
die("Invalid ref name or SHA1 expression: %s", from);
17571764

17581765
n->next = NULL;

0 commit comments

Comments
 (0)